]> gitweb.factorcode.org Git - factor.git/commitdiff
sequences.extras: simpler round-robin.
authorJohn Benediktsson <mrjbq7@gmail.com>
Thu, 31 May 2012 15:17:08 +0000 (08:17 -0700)
committerJohn Benediktsson <mrjbq7@gmail.com>
Thu, 31 May 2012 15:17:08 +0000 (08:17 -0700)
extra/sequences/extras/extras-tests.factor
extra/sequences/extras/extras.factor

index 2ef0bfe15f920b1074e4b783e646066a1ff9640e..1c9a376ca3d126734526e03c8adca59408740821 100644 (file)
@@ -72,4 +72,5 @@ IN: sequences.extras.tests
 { 8 } [ 3 iota dup [ 1 + * ] 2map-sum ] unit-test
 { 4 } [ "hello" "jello" [ = ] 2count ] unit-test
 
-{ "ADEBFC" } [ { "ABC" "D" "EF" } round-robin ] unit-test
+{ { } } [ { } round-robin ] unit-test
+{ "ADEBFC" } [ { "ABC" "D" "EF" } round-robin >string ] unit-test
index 0759d8172f81fd084633b1244a473f8a752583a8..b84955d843ffa720a54a3a440a94e4186da4c8dd 100644 (file)
@@ -184,15 +184,12 @@ PRIVATE>
 : 2count ( ... seq1 seq2 quot: ( ... elt1 elt2 -- ... ? ) -- ... n )
     [ 1 0 ? ] compose 2map-sum ; inline
 
-:: round-robin-as ( seqs exemplar -- newseq )
-    seqs length :> len
-    0 0 seqs sum-lengths [
-        f [
-            drop dup len >= [ drop 1 + 0 ] when
-            2dup seqs nth-unsafe ?nth
-            [ 1 + ] [ dup not ] bi*
-        ] loop
-    ] exemplar replicate-as 2nip ;
-
-: round-robin ( seqs -- newseq )
-    [ { } ] [ dup first round-robin-as ] if-empty ;
+: max-lengths ( seq -- n )
+    [ length ] [ max ] map-reduce ;
+
+: round-robin ( seq -- newseq )
+    [ { } ] [
+        dup [ max-lengths ] [ length ] bi [ iota ] bi@
+        [ [ 2array ] with map ] curry map concat swap
+        [ [ first2 ] dip nth-unsafe ?nth ] curry map sift
+    ] if-empty ;