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)
parent
98c9b79881
commit
08b26f6739
|
@ -0,0 +1 @@
|
|||
Joe Groff
|
|
@ -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
|
|
@ -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
|
||||
|
|
@ -0,0 +1 @@
|
|||
Direct the output of map-as, filter-as, etc. combinators into existing growable sequences
|
Loading…
Reference in New Issue