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)

db4
Joe Groff 2010-02-07 00:13:32 -08:00
parent 98c9b79881
commit 08b26f6739
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