sequences.extras: simpler round-robin.
parent
5de9ec1b1f
commit
58185a06ce
|
@ -72,4 +72,5 @@ IN: sequences.extras.tests
|
||||||
{ 8 } [ 3 iota dup [ 1 + * ] 2map-sum ] unit-test
|
{ 8 } [ 3 iota dup [ 1 + * ] 2map-sum ] unit-test
|
||||||
{ 4 } [ "hello" "jello" [ = ] 2count ] 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
|
||||||
|
|
|
@ -184,15 +184,12 @@ PRIVATE>
|
||||||
: 2count ( ... seq1 seq2 quot: ( ... elt1 elt2 -- ... ? ) -- ... n )
|
: 2count ( ... seq1 seq2 quot: ( ... elt1 elt2 -- ... ? ) -- ... n )
|
||||||
[ 1 0 ? ] compose 2map-sum ; inline
|
[ 1 0 ? ] compose 2map-sum ; inline
|
||||||
|
|
||||||
:: round-robin-as ( seqs exemplar -- newseq )
|
: max-lengths ( seq -- n )
|
||||||
seqs length :> len
|
[ length ] [ max ] map-reduce ;
|
||||||
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 )
|
: round-robin ( seq -- newseq )
|
||||||
[ { } ] [ dup first round-robin-as ] if-empty ;
|
[ { } ] [
|
||||||
|
dup [ max-lengths ] [ length ] bi [ iota ] bi@
|
||||||
|
[ [ 2array ] with map ] curry map concat swap
|
||||||
|
[ [ first2 ] dip nth-unsafe ?nth ] curry map sift
|
||||||
|
] if-empty ;
|
||||||
|
|
Loading…
Reference in New Issue