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)

Joe Groff 2010-02-07 00:13:32 -08:00
parent 677c74b0eb
commit 175c5f014c
4 changed files with 79 additions and 0 deletions

View File

@ -0,0 +1 @@
Joe Groff

View File

@ -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 <back-inserter> map-as
] unit-test
[ t ] [
{ "three" "four" "five" }
[ >title ] V{ 1 2 } clone [ <back-inserter> map-as ] keep eq?
] unit-test
[ V{ 1 2 "Three" "Four" "Five" } ] [
{ { "Th" "ree" } { "Fo" "ur" } { "Fi" "ve" } }
[ append ] V{ 1 2 } clone <back-inserter> assoc>map
] unit-test
[ t ] [
{ { "Th" "ree" } { "Fo" "ur" } { "Fi" "ve" } }
[ append ] V{ 1 2 } clone [ <back-inserter> assoc>map ] keep eq?
] unit-test
[ V{ "Three" "Four" "Five" } ] [
{ "three" "four" "five" }
[ >title ] V{ 1 2 } clone <replacer> map-as
] unit-test
[ t ] [
{ "three" "four" "five" }
[ >title ] V{ 1 2 } clone [ <replacer> map-as ] keep eq?
] unit-test

View File

@ -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> 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> 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 <offset-growable> ; inline
TUPLE: replacer { underlying read-only } ;
C: <replacer> replacer
INSTANCE: replacer inserter
M: replacer new-sequence
underlying>> [ set-length ] keep ; inline

View File

@ -0,0 +1 @@
Direct the output of map-as, filter-as, etc. combinators into existing growable sequences