Skip to content

Instantly share code, notes, and snippets.

@chris-martin
Last active December 17, 2015 18:19
Show Gist options
  • Save chris-martin/5651925 to your computer and use it in GitHub Desktop.
Save chris-martin/5651925 to your computer and use it in GitHub Desktop.
class Generator
constructor: (@next) ->
map: (f) ->
new Generator =>
x = @next()
return f(x) if x != undefined
flatMap: (f) ->
gen = undefined
new Generator =>
while true
if gen == undefined
x = @next()
return if x == undefined
gen = f(x)
else
x = gen.next()
if x == undefined
gen = undefined
else
return x
filter: (predicate) ->
new Generator =>
while true
x = @next()
return if x == undefined
return x if predicate(x)
find: (predicate) ->
@filter(predicate).next()
takeWhile: (predicate) ->
new Generator =>
x = @next()
return x if predicate(x)
all: (predicate) ->
while true
x = @next()
return true if x == undefined
return false if !predicate(x)
best: (choose) ->
m = undefined
while true
x = @next()
return m if x == undefined
m =
if m == undefined
x
else
choose(x, m)
m
max: ->
@best(Math.max)
sum: ->
s = 0
while true
x = @next()
return s if x == undefined
s += x
array: ->
a = []
while true
x = @next()
return a if x == undefined
a.push x
Generator.from = (start) ->
i = start - 1
new Generator ->
i += 1
i
Generator.range = (start, end) ->
i = start - 1
new Generator ->
return if i == end
i += 1
i
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment