Skip to content

Instantly share code, notes, and snippets.

@menduz
Created November 5, 2019 18:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save menduz/a6816b192a2f5dee747cf7e1d759456c to your computer and use it in GitHub Desktop.
Save menduz/a6816b192a2f5dee747cf7e1d759456c to your computer and use it in GitHub Desktop.
mapUntil skipUntil in DataWeave
%dw 2.0
output application/json
fun mapUntil<T, V>(
iterableList: Array<T>,
predicate: (element: T, index: Number) -> ({value: V} | {done: Boolean}),
startIndex: Number = 0
) =
iterableList match {
case [] -> []
case [head ~ tail] -> do {
var result = predicate(head, startIndex)
---
if (result.done)
[]
else
[result.value ~ mapUntil(tail, predicate, startIndex + 1)]
}
}
// ------------------
fun take<T>(list: Array<T>, num: Number): Array<T> =
(list mapUntil {value: $, done: $$ >= num}) as Array<T>
// it doesn't work if we remove the `as Array<T>`
fun skip<T>(list: Array<T>, num: Number): Array<T> =
(list skipUntil ($$ < num)) as Array<T>
fun skipUntil<T>(
list: Array<T>,
predicate: (element: T, index: Number) -> Boolean,
startIndex: Number = 0
): Array<T> =
list match {
case [] -> []
case [head ~ tail] -> do {
var shouldSkip = predicate(head, startIndex)
---
if (shouldSkip)
skipUntil(tail, predicate, startIndex + 1)
else
list
}
}
---
do {
fun integers(startingAt = 0) = [startingAt ~ integers(startingAt + 1)]
var integerNumbers = integers()
---
integerNumbers skip 5 take 10 map $ * 10
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment