]> gitweb.factorcode.org Git - factor.git/commitdiff
assocs: making unzip generic to be faster on hashtables.
authorJohn Benediktsson <mrjbq7@gmail.com>
Mon, 29 Mar 2021 18:16:15 +0000 (11:16 -0700)
committerJohn Benediktsson <mrjbq7@gmail.com>
Mon, 29 Mar 2021 18:16:15 +0000 (11:16 -0700)
core/assocs/assocs.factor
core/hashtables/hashtables.factor

index e6e18db924c22bdc7eeaa2109e8fb1ae991d1a6d..a199abb2dcabe02de03e5a6dba1194016e1cc9e0 100644 (file)
@@ -18,6 +18,7 @@ GENERIC: assoc-clone-like ( assoc exemplar -- newassoc )
 GENERIC: >alist ( assoc -- newassoc )
 GENERIC: keys ( assoc -- keys )
 GENERIC: values ( assoc -- values )
+GENERIC: unzip ( assoc -- keys values )
 
 M: assoc assoc-like drop ; inline
 
@@ -242,7 +243,7 @@ M: assoc value-at* swap [ = nip ] curry assoc-find nip ;
 : zip-index ( values -- alist )
     { } zip-index-as ; inline
 
-: unzip ( assoc -- keys values )
+M: assoc unzip
     dup assoc-empty? [ drop { } { } ] [ >alist flip first2 ] if ;
 
 : zip-with-as ( ... seq quot: ( ... key -- ... value ) exemplar -- ... assoc )
@@ -311,6 +312,8 @@ M: enumerated keys seq>> length <iota> >array ; inline
 
 M: enumerated values seq>> >array ; inline
 
+M: enumerated unzip seq>> [ length <iota> ] keep [ >array ] bi@ ;
+
 M: enumerated assoc-size seq>> length ; inline
 
 M: enumerated clear-assoc seq>> delete-all ; inline
index 7d072f93a391a79d100b87f1dd7f3e786d238f86..79fe86093db7d4bcb46aba47492208ab61a8db35 100644 (file)
@@ -165,6 +165,10 @@ M: hashtable keys [ drop ] collect-pairs ;
 
 M: hashtable values [ nip ] collect-pairs ;
 
+M: hashtable unzip
+    [ assoc-size dup [ <vector> ] bi@ ] [ array>> ] bi
+    [ [ suffix! ] bi-curry@ bi* ] each-pair [ { } like ] bi@ ;
+
 M: hashtable clone
     (clone) [ clone ] change-array ; inline