1 ! (c)2010 Joe Groff bsd license
2 USING: accessors fry growable kernel locals math sequences ;
3 IN: sequences.inserters
5 TUPLE: offset-growable { underlying read-only } { offset read-only } ;
6 C: <offset-growable> offset-growable
7 INSTANCE: offset-growable virtual-sequence
8 M: offset-growable length
9 [ underlying>> length ] [ offset>> ] bi - ; inline
10 M: offset-growable virtual-exemplar
12 M: offset-growable virtual@
13 [ offset>> + ] [ underlying>> ] bi ; inline
14 M: offset-growable set-length
15 [ offset>> + ] [ underlying>> ] bi set-length ; inline
19 nip underlying>> ; inline
20 M: inserter new-resizable
21 [ drop 0 ] dip new-sequence ; inline
25 TUPLE: appender { underlying read-only } ;
26 C: <appender> appender
28 INSTANCE: appender inserter
30 M:: appender new-sequence ( len inserter -- sequence )
31 inserter underlying>> :> underlying
32 underlying length :> old-length
33 old-length len + :> new-length
34 new-length underlying set-length
35 underlying old-length <offset-growable> ; inline
37 TUPLE: replacer { underlying read-only } ;
38 C: <replacer> replacer
40 INSTANCE: replacer inserter
42 M: replacer new-sequence
43 underlying>> [ set-length ] keep ; inline