diff --git a/extra/sequences/merged/authors.txt b/extra/sequences/merged/authors.txt new file mode 100644 index 0000000000..e9c193bac7 --- /dev/null +++ b/extra/sequences/merged/authors.txt @@ -0,0 +1 @@ +Alex Chapman diff --git a/extra/sequences/merged/merged-docs.factor b/extra/sequences/merged/merged-docs.factor new file mode 100644 index 0000000000..ca68a9030b --- /dev/null +++ b/extra/sequences/merged/merged-docs.factor @@ -0,0 +1,51 @@ +USING: help.markup help.syntax sequences ; +IN: sequences.merged + +ARTICLE: "sequences-merge" "Merging sequences" +"When multiple sequences are merged into one sequence, the new sequence takes an element from each input sequence in turn. For example, if we merge " { $code "{ 1 2 3 }" } "and" { $code "{ \"a\" \"b\" \"c\" }" } "we get:" { $code "{ 1 \"a\" 2 \"b\" 3 \"c\" }" } "." +{ $subsection merge } +{ $subsection 2merge } +{ $subsection 3merge } +{ $subsection } +{ $subsection <2merged> } +{ $subsection <3merged> } ; + +ABOUT: "sequences-merge" + +HELP: merged +{ $class-description "A virtual sequence which presents a merged view of its underlying elements. New instances are created by calling one of " { $link } ", " { $link <2merged> } ", or " { $link <3merged> } "." } +{ $see-also merge } ; + +HELP: ( seqs -- merged ) +{ $values { "seqs" "a sequence of sequences to merge" } { "merged" "a virtual sequence" } } +{ $description "Creates an instance of the " { $link merged } " virtual sequence." } +{ $see-also <2merged> <3merged> merge } ; + +HELP: <2merged> ( seq1 seq2 -- merged ) +{ $values { "seq1" sequence } { "seq2" sequence } { "merged" "a virtual sequence" } } +{ $description "Creates an instance of the " { $link merged } " virtual sequence which merges the two input sequences." } +{ $see-also <3merged> 2merge } ; + +HELP: <3merged> ( seq1 seq2 seq3 -- merged ) +{ $values { "seq1" sequence } { "seq2" sequence } { "seq3" sequence } { "merged" "a virtual sequence" } } +{ $description "Creates an instance of the " { $link merged } " virtual sequence which merges the three input sequences." } +{ $see-also <2merged> 3merge } ; + +HELP: merge ( seqs -- seq ) +{ $values { "seqs" "a sequence of sequences to merge" } { "seq" "a new sequence" } } +{ $description "Outputs a new sequence which merges the elements of each sequence in " { $snippet "seqs" } "." } +{ $examples + { $example "USING: prettyprint sequences.merged ;" "{ { 1 2 } { 3 4 } { 5 6 } } merge ." "{ 1 3 5 2 4 6 }" } + { $example "USING: prettyprint sequences.merged ;" "{ \"abc\" \"def\" } merge ." "\"adbecf\"" } +} +{ $see-also 2merge 3merge } ; + +HELP: 2merge ( seq1 seq2 -- seq ) +{ $values { "seq1" sequence } { "seq2" sequence } { "seq" "a new sequence" } } +{ $description "Creates a new sequence of the same type as " { $snippet "seq1" } " which merges the elements of " { $snippet "seq1" } " and " { $snippet "seq2" } } +{ $see-also merge 3merge <2merged> } ; + +HELP: 3merge ( seq1 seq2 seq3 -- seq ) +{ $values { "seq1" sequence } { "seq2" sequence } { "seq3" sequence } { "seq" "a new sequence" } } +{ $description "Creates a new sequence of the same type as " { $snippet "seq1" } " which merges the elements of all three sequences" } +{ $see-also merge 2merge <3merged> } ; diff --git a/extra/sequences/merged/merged-tests.factor b/extra/sequences/merged/merged-tests.factor new file mode 100644 index 0000000000..13a46f0b72 --- /dev/null +++ b/extra/sequences/merged/merged-tests.factor @@ -0,0 +1,17 @@ +USING: sequences sequences.merged tools.test ; +IN: sequences.merged.tests + +[ 0 { 1 2 } ] [ 0 T{ merged f { { 1 2 } { 3 4 } } } virtual@ ] unit-test +[ 0 { 3 4 } ] [ 1 T{ merged f { { 1 2 } { 3 4 } } } virtual@ ] unit-test +[ 1 { 1 2 } ] [ 2 T{ merged f { { 1 2 } { 3 4 } } } virtual@ ] unit-test +[ 4 ] [ 3 { { 1 2 3 4 } } nth ] unit-test +[ 4 { { 1 2 3 4 } } nth ] must-fail + +[ 1 ] [ 0 { 1 2 3 } { 4 5 6 } <2merged> nth ] unit-test +[ 4 ] [ 1 { 1 2 3 } { 4 5 6 } <2merged> nth ] unit-test +[ 2 ] [ 2 { 1 2 3 } { 4 5 6 } <2merged> nth ] unit-test +[ 5 ] [ 3 { 1 2 3 } { 4 5 6 } <2merged> nth ] unit-test +[ 3 ] [ 4 { 1 2 3 } { 4 5 6 } <2merged> nth ] unit-test +[ 6 ] [ 5 { 1 2 3 } { 4 5 6 } <2merged> nth ] unit-test + +[ 4 ] [ 4 { 1 2 } { 3 4 } { 5 6 } 3merge nth ] unit-test diff --git a/extra/sequences/merged/merged.factor b/extra/sequences/merged/merged.factor new file mode 100644 index 0000000000..2fdf65ec9e --- /dev/null +++ b/extra/sequences/merged/merged.factor @@ -0,0 +1,26 @@ +! Copyright (C) 2008 Alex Chapman +! See http://factorcode.org/license.txt for BSD license. +USING: accessors arrays kernel math sequences ; +IN: sequences.merged + +TUPLE: merged seqs ; +C: merged + +: <2merged> ( seq1 seq2 -- merged ) 2array ; +: <3merged> ( seq1 seq2 seq3 -- merged ) 3array ; + +: merge ( seqs -- seq ) + dup swap first like ; + +: 2merge ( seq1 seq2 -- seq ) + dupd <2merged> rot like ; + +: 3merge ( seq1 seq2 seq3 -- seq ) + pick >r <3merged> r> like ; + +M: merged length seqs>> [ length ] map sum ; + +M: merged virtual@ ( n seq -- n' seq' ) + seqs>> [ length /mod ] [ nth ] bi ; + +INSTANCE: merged virtual-sequence diff --git a/extra/sequences/merged/summary.txt b/extra/sequences/merged/summary.txt new file mode 100644 index 0000000000..1a514df4e2 --- /dev/null +++ b/extra/sequences/merged/summary.txt @@ -0,0 +1 @@ +A virtual sequence which merges (interleaves) other sequences. diff --git a/extra/sequences/merged/tags.txt b/extra/sequences/merged/tags.txt new file mode 100644 index 0000000000..42d711b32b --- /dev/null +++ b/extra/sequences/merged/tags.txt @@ -0,0 +1 @@ +collections