Skip to content

Instantly share code, notes, and snippets.

@bluenote10
Last active June 22, 2021 16:31
Show Gist options
  • Save bluenote10/d6c4044889899f6ecddf11265a64c221 to your computer and use it in GitHub Desktop.
Save bluenote10/d6c4044889899f6ecddf11265a64c221 to your computer and use it in GitHub Desktop.
Flatmap
import future
import options
#[
proc flatMap[X](iter: iterator(): X, mapper: X -> iterator(): X): (iterator(): B) =
result = proc() =
yield X
proc iter(): int =
yield 1
yield 2
yield 3
let r =
]#
iterator items[X](o: Option[X]): X =
if o.isSome:
yield o.get
proc flatMap[X, Y](enumerable: seq[X], mapper: X -> Y): seq[X] =
result = newSeq[X]()
for x in enumerable:
for y in mapper(x):
result &= y
let s = @[1, 2, 3]
# Emulating map
echo s.flatMap(x => @[x*x])
echo s.flatMap(x => some(x*x))
# Emulating filter
echo s.flatMap(x => (if x mod 2 == 1: @[x] else: @[]))
echo s.flatMap(x => (if x mod 2 == 1: some(x) else: none(int)))
# flatMap allows map + filter
echo s.flatMap(x => (if x mod 2 == 1: @[x*x] else: @[]))
echo s.flatMap(x => (if x mod 2 == 1: some(x*x) else: none(int)))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment