From 08b26f673971999ab17b0fcbf8f76e18a9b8e308 Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Sun, 7 Feb 2010 00:13:32 -0800 Subject: [PATCH] sequences.inserters: a new utility that abuses the exemplar parameter of *-as combinators to direct their output into existing growable sequences, either appending to the end of the vector (appender) or emptying the vector and replacing the contents (replacer) --- extra/sequences/inserters/authors.txt | 1 + .../inserters/inserters-tests.factor | 33 ++++++++++++++ extra/sequences/inserters/inserters.factor | 44 +++++++++++++++++++ extra/sequences/inserters/summary.txt | 1 + 4 files changed, 79 insertions(+) create mode 100644 extra/sequences/inserters/authors.txt create mode 100644 extra/sequences/inserters/inserters-tests.factor create mode 100644 extra/sequences/inserters/inserters.factor create mode 100644 extra/sequences/inserters/summary.txt diff --git a/extra/sequences/inserters/authors.txt b/extra/sequences/inserters/authors.txt new file mode 100644 index 0000000000..f13c9c1e77 --- /dev/null +++ b/extra/sequences/inserters/authors.txt @@ -0,0 +1 @@ +Joe Groff diff --git a/extra/sequences/inserters/inserters-tests.factor b/extra/sequences/inserters/inserters-tests.factor new file mode 100644 index 0000000000..b1f8691a8d --- /dev/null +++ b/extra/sequences/inserters/inserters-tests.factor @@ -0,0 +1,33 @@ +! (c)2010 Joe Groff bsd license +USING: sequences.inserters tools.test ; +IN: sequences.inserters.tests + +[ V{ 1 2 "Three" "Four" "Five" } ] [ + { "three" "four" "five" } + [ >title ] V{ 1 2 } clone map-as +] unit-test + +[ t ] [ + { "three" "four" "five" } + [ >title ] V{ 1 2 } clone [ map-as ] keep eq? +] unit-test + +[ V{ 1 2 "Three" "Four" "Five" } ] [ + { { "Th" "ree" } { "Fo" "ur" } { "Fi" "ve" } } + [ append ] V{ 1 2 } clone assoc>map +] unit-test + +[ t ] [ + { { "Th" "ree" } { "Fo" "ur" } { "Fi" "ve" } } + [ append ] V{ 1 2 } clone [ assoc>map ] keep eq? +] unit-test + +[ V{ "Three" "Four" "Five" } ] [ + { "three" "four" "five" } + [ >title ] V{ 1 2 } clone map-as +] unit-test + +[ t ] [ + { "three" "four" "five" } + [ >title ] V{ 1 2 } clone [ map-as ] keep eq? +] unit-test diff --git a/extra/sequences/inserters/inserters.factor b/extra/sequences/inserters/inserters.factor new file mode 100644 index 0000000000..08b9b8911d --- /dev/null +++ b/extra/sequences/inserters/inserters.factor @@ -0,0 +1,44 @@ +! (c)2010 Joe Groff bsd license +USING: accessors fry growable kernel locals math sequences ; +IN: sequences.inserters + +TUPLE: offset-growable { underlying read-only } { offset read-only } ; +C: offset-growable +INSTANCE: offset-growable virtual-sequence +M: offset-growable length + [ underlying>> length ] [ offset>> ] bi - ; inline +M: offset-growable virtual-exemplar + underlying>> ; inline +M: offset-growable virtual@ + [ offset>> + ] [ underlying>> ] bi ; inline +M: offset-growable set-length + [ offset>> + ] [ underlying>> ] bi set-length ; inline + +MIXIN: inserter +M: inserter like + nip underlying>> ; inline +M: inserter new-resizable + [ drop 0 ] dip new-sequence ; inline +M: inserter length + drop 0 ; inline + +TUPLE: back-inserter { underlying read-only } ; +C: back-inserter + +INSTANCE: back-inserter inserter + +M:: back-inserter new-sequence ( len inserter -- sequence ) + inserter underlying>> :> underlying + underlying length :> old-length + old-length len + :> new-length + new-length underlying set-length + underlying old-length ; inline + +TUPLE: replacer { underlying read-only } ; +C: replacer + +INSTANCE: replacer inserter + +M: replacer new-sequence + underlying>> [ set-length ] keep ; inline + diff --git a/extra/sequences/inserters/summary.txt b/extra/sequences/inserters/summary.txt new file mode 100644 index 0000000000..30f6e66d3a --- /dev/null +++ b/extra/sequences/inserters/summary.txt @@ -0,0 +1 @@ +Direct the output of map-as, filter-as, etc. combinators into existing growable sequences