]> gitweb.factorcode.org Git - factor.git/commitdiff
containers: experimental container syntax
authorJohn Benediktsson <mrjbq7@gmail.com>
Sun, 21 Jan 2024 20:39:32 +0000 (12:39 -0800)
committerJohn Benediktsson <mrjbq7@gmail.com>
Sun, 21 Jan 2024 20:39:32 +0000 (12:39 -0800)
extra/containers/authors.txt [new file with mode: 0644]
extra/containers/containers.factor [new file with mode: 0644]
extra/containers/tags.txt [new file with mode: 0644]

diff --git a/extra/containers/authors.txt b/extra/containers/authors.txt
new file mode 100644 (file)
index 0000000..e091bb8
--- /dev/null
@@ -0,0 +1 @@
+John Benediktsson
diff --git a/extra/containers/containers.factor b/extra/containers/containers.factor
new file mode 100644 (file)
index 0000000..ef2e18b
--- /dev/null
@@ -0,0 +1,69 @@
+USING: accessors assocs deques dlists growable kernel math
+sequences sets ;
+
+IN: containers
+
+GENERIC: count ( obj -- n )
+
+M: sequence count length ;
+M: assoc count assoc-size ;
+M: set count cardinality ;
+
+GENERIC: capacity ( obj -- n )
+
+M: object capacity count ;
+M: growable capacity underlying>> length ;
+
+GENERIC: contains? ( elt obj -- ? )
+
+M: sequence contains? member? ;
+M: assoc contains? key? ;
+M: set contains? sets:in? ;
+M: deque contains? deque-member? ;
+
+GENERIC: items ( obj -- seq )
+
+M: sequence items ;
+M: set items members ;
+M: assoc items >alist ;
+M: dlist items dlist>sequence ;
+
+GENERIC: empty? ( obj -- ? )
+
+M: object empty? count zero? ; inline
+M: dlist empty? front>> not ; inline
+M: deque empty? deque-empty? ; inline
+
+GENERIC: add ( elt obj -- )
+
+M: sequence add push ;
+M: set add adjoin ;
+
+GENERIC: lookup ( key obj -- elt )
+M: sequence lookup nth ;
+M: assoc lookup at ;
+
+! XXX: at ( key obj -- elt ) and of ( obj key -- elt )
+
+GENERIC: remove ( elt obj -- )
+
+M: sequence remove remove-nth! drop ;
+M: set remove delete ;
+
+GENERIC: remove-all ( obj -- )
+
+M: sequence remove-all delete-all ;
+M: assoc remove-all clear-assoc ;
+M: set remove-all clear-set ;
+M: deque remove-all clear-deque ;
+
+GENERIC: like ( obj exemplar -- newobj )
+
+M: sequence like sequences:like ;
+M: assoc like assoc-like ;
+M: set like set-like ;
+
+GENERIC: clone-like ( obj exemplar -- newobj )
+
+M: sequence clone-like sequences:clone-like ;
+M: assoc clone-like assoc-clone-like ;
diff --git a/extra/containers/tags.txt b/extra/containers/tags.txt
new file mode 100644 (file)
index 0000000..42d711b
--- /dev/null
@@ -0,0 +1 @@
+collections