Based on question Create chain in lodash with custom functions I would like to chain my own custom function with the following requirements:
- Keep fluent
- Return a Seq
- Keep lazy behavior
For example consider the sequence res
resulting from the following query:
const src = [0, 1, 1, 6, 6, 6, 1, 1, 12, 12, 6, 6]
const res = _(src)
.filter(nr => nr % 2 == 0)
.map(nr => 'nr:' + nr)
console.log(res.value()) // => ['nr:0','nr:6','nr:6','nr:6','nr:12','nr:12','nr:6','nr:6' ]
Now, I would like to interleave between filter()
and map()
, a new collapse()
operation which merges series of adjacent elements.
I am implementing collapse()
like this:
function collapse(src) {
const res = []
let prev = undefined
for(let curr of src) {
if(prev != curr) {
prev = curr
res.push(curr)
}
}
return _(res)
}
But this solution does not fulfill requirements: 1. Keep fluent, and 3. Keep lazy behavior. To use this collapse()
we have to write:
collapse(
_(src)
.filter(nr => nr % 2 == 0)
)
.map(nr => 'nr: ' + nr) // => [ 'nr: 0', 'nr: 6', 'nr: 12', 'nr: 6' ]
Instead, I would like to write: _(src).filter(nr => nr % 2 == 0).collapse().map(nr => 'nr: ' + nr)
Even worst, the collapse is being performed eagerly.
From this answer I see that we can extend the lodash prototype with the mixin utility function. Yet, am not figuring out how can I access the elements of the previous operation (e.g. filter()
) for being parsed in collapse()
function?