rebellion icon indicating copy to clipboard operation
rebellion copied to clipboard

Transducers for inserting extra elements into the stream

Open jackfirth opened this issue 5 years ago • 3 comments

Signatures:

(inserting-at [v any/c]
              [position natural?]
              [#:mode mode out-of-bounds-insertion-mode?
                 raise-out-of-bounds-error]) -> transducer?
out-of-bounds-insertion-mode? : predicate/c
raise-out-of-bounds-error : out-of-bounds-insertion-mode?
skip-out-of-bounds-insertion : out-of-bounds-insertion-mode?
insert-out-of-bounds-at-end : out-of-bounds-insertion-mode?
(inserting-at-start [v any/c]) -> transducer?
(inserting-at-end [v any/c]) -> transducer?

Examples:

> (transduce "aaa" (inserting-at-start #\x) #:into into-string)
"xaaa"

> (transduce "aaa" (inserting-at-end #\x) #:into into-string)
"aaax"

> (transduce "aaa" (inserting-at #\x 1) #:into into-string)
"axaa"

> (transduce "aaa" (inserting-at #\x 8) #:into into-string)
error: out of bounds!

> (transduce "aaa"
             (inserting-at #\x 8 #:mode skip-out-of-bounds-insertion)
             #:into into-string)
"aaa"

> (transduce "aaa"
             (inserting-at #\x 8 #:mode insert-out-of-bounds-at-end)
             #:into into-string)
"aaax"

jackfirth avatar Nov 12 '19 18:11 jackfirth

Does inserting-in-between seem like a good addition for this?

Signature:

(inserting-in-between [v any/c]) -> transducer?

Example:

> (transduce "aaa"
             (inserting-in-between #\b)
             #:into into-string)
"ababa"

samdphillips avatar Nov 12 '19 18:11 samdphillips

Yes, definitely. Eventually I want to offer a transducer-based alternative for all of the use cases of add-between, including the various keyword arguments it has. Will probably be multiple issues though, since add-between does a lot of different things. That #:splice? keyword is magic.

jackfirth avatar Nov 12 '19 19:11 jackfirth

@samdphillips Over four years later, your suggestion is finally implemented. See #524.

jackfirth avatar Feb 15 '24 02:02 jackfirth