GENERIC: >alist ( assoc -- newassoc )
GENERIC: keys ( assoc -- keys )
GENERIC: values ( assoc -- values )
+GENERIC: unzip ( assoc -- keys values )
M: assoc assoc-like drop ; inline
: 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 )
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
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