]> gitweb.factorcode.org Git - factor.git/commitdiff
assocs.extras: adding a "zip-as" that is faster than "zip >hashtable".
authorJohn Benediktsson <mrjbq7@gmail.com>
Thu, 12 Jul 2012 03:37:12 +0000 (20:37 -0700)
committerJohn Benediktsson <mrjbq7@gmail.com>
Thu, 12 Jul 2012 03:37:12 +0000 (20:37 -0700)
extra/assocs/extras/extras-tests.factor
extra/assocs/extras/extras.factor

index 0916a217287d475dbef6b4d9eca859c4de2ffdc1..e490beeaf10f9741f58559d6cf042101474efcfc 100644 (file)
@@ -9,3 +9,7 @@ IN: assocs.extras
 { f } [ H{ { "a" H{ { "b" 1 } } } } { "a" "c" } deep-at ] unit-test
 { 1 } [ H{ { "a" H{ { "b" 1 } } } } { "a" "b" } deep-at ] unit-test
 { 4 } [ H{ { 1 H{ { 2 H{ { 3 4 } } } } } } { 1 2 3 } deep-at ] unit-test
+
+{  { { 1 3 } { 2 4 } } } [ { 1 2 } { 3 4 }  { } zip-as ] unit-test
+{ V{ { 1 3 } { 2 4 } } } [ { 1 2 } { 3 4 } V{ } zip-as ] unit-test
+{ H{ { 1 3 } { 2 4 } } } [ { 1 2 } { 3 4 } H{ } zip-as ] unit-test
index 18b84780421a86e47be588e634c266ab87aa10e3..d788ff6ce5bfdd7920db463bc17b584e3177d959 100644 (file)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2012 John Benediktsson
 ! See http://factorcode.org/license.txt for BSD license
 
-USING: assocs kernel sequences ;
+USING: arrays assocs assocs.private kernel sequences ;
 
 IN: assocs.extras
 
@@ -13,3 +13,11 @@ IN: assocs.extras
 
 : deep-at ( assoc seq -- value/f )
     [ swap at ] each ;
+
+: zip-as ( keys values exemplar -- assocs )
+    dup sequence? [
+        [ 2array ] swap 2map-as
+    ] [
+        [ dup length ] dip new-assoc
+        [ [ set-at ] with-assoc 2each ] keep
+    ] if ;