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
677c74b0eb
commit
175c5f014c
|
|
@ -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