jackfirth / rebellion

A collection of core libraries for Racket
https://pkgs.racket-lang.org/package/rebellion
Apache License 2.0
80 stars 16 forks source link

Transducers for inserting extra elements into the stream #346

Open jackfirth opened 4 years ago

jackfirth commented 4 years ago

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"
samdphillips commented 4 years ago

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"
jackfirth commented 4 years ago

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 commented 6 months ago

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