From: John Benediktsson Date: Sun, 21 Jan 2024 20:39:32 +0000 (-0800) Subject: containers: experimental container syntax X-Git-Url: https://gitweb.factorcode.org/gitweb.cgi?p=factor.git;a=commitdiff_plain;h=b0dc73f3702fa9e5b9cf8ba4c693435ce86b8ef4 containers: experimental container syntax --- diff --git a/extra/containers/authors.txt b/extra/containers/authors.txt new file mode 100644 index 0000000000..e091bb8164 --- /dev/null +++ b/extra/containers/authors.txt @@ -0,0 +1 @@ +John Benediktsson diff --git a/extra/containers/containers.factor b/extra/containers/containers.factor new file mode 100644 index 0000000000..ef2e18b2bd --- /dev/null +++ b/extra/containers/containers.factor @@ -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 index 0000000000..42d711b32b --- /dev/null +++ b/extra/containers/tags.txt @@ -0,0 +1 @@ +collections