]> gitweb.factorcode.org Git - factor.git/commitdiff
Adding sequences.merged
authorAlex Chapman <chapman.alex@gmail.com>
Sun, 18 May 2008 09:09:56 +0000 (19:09 +1000)
committerAlex Chapman <chapman.alex@gmail.com>
Sun, 18 May 2008 09:09:56 +0000 (19:09 +1000)
extra/sequences/merged/authors.txt [new file with mode: 0644]
extra/sequences/merged/merged-docs.factor [new file with mode: 0644]
extra/sequences/merged/merged-tests.factor [new file with mode: 0644]
extra/sequences/merged/merged.factor [new file with mode: 0644]
extra/sequences/merged/summary.txt [new file with mode: 0644]
extra/sequences/merged/tags.txt [new file with mode: 0644]

diff --git a/extra/sequences/merged/authors.txt b/extra/sequences/merged/authors.txt
new file mode 100644 (file)
index 0000000..e9c193b
--- /dev/null
@@ -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 (file)
index 0000000..ca68a90
--- /dev/null
@@ -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 <merged> }
+{ $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 <merged> } ", " { $link <2merged> } ", or " { $link <3merged> } "." }
+{ $see-also merge } ;
+
+HELP: <merged> ( 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 <merged> <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 <merged> <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 <merged> } ;
+
+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 (file)
index 0000000..13a46f0
--- /dev/null
@@ -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 } } <merged> nth ] unit-test
+[ 4 { { 1 2 3 4 } } <merged> 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 (file)
index 0000000..2fdf65e
--- /dev/null
@@ -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> merged
+
+: <2merged> ( seq1 seq2 -- merged ) 2array <merged> ;
+: <3merged> ( seq1 seq2 seq3 -- merged ) 3array <merged> ;
+
+: merge ( seqs -- seq )
+    dup <merged> 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 (file)
index 0000000..1a514df
--- /dev/null
@@ -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 (file)
index 0000000..42d711b
--- /dev/null
@@ -0,0 +1 @@
+collections