cons-lists/src/reduce.coffee

48 lines
1.1 KiB
CoffeeScript

{car, cdr, cons, listp, pairp, nilp,
nil, list, listToString} = require './lists'
reduce = (lst, iteratee, memo, context) ->
count = 0
console.log lst
return memo if nilp lst
memo = iteratee.call(context, memo, (car lst), count)
lst = cdr lst
count++
while not nilp lst
memo = iteratee.call(context, memo, (car lst), count)
count++
lst = cdr lst
null
memo
map = (lst, iteratee, context, count = 0) ->
return nil if nilp lst
product = iteratee.call(context, (car lst), count, lst)
rest = if (nilp cdr lst) then nil else
map((cdr lst), iteratee, context, count + 1)
cons product, rest
rmap = (lst, iteratee, context, count = 0) ->
return nil if nilp lst
product = (if (nilp cdr lst) then nil else
map((cdr lst), iteratee, context, count + 1))
cons product, iteratee.call(context, (car lst), count, lst)
filter = (lst, iteratee, context) ->
return nil if nilp lst
if iteratee.call(context, (car lst), lst)
cons (car lst), filter (cdr lst)
else
filter (cdr list)
reverse = (lst) -> rmap lst, (i) -> i
module.exports =
reduce: reduce
map: map
rmap: rmap
filter: filter
reverse: reverse