48 lines
1.1 KiB
CoffeeScript
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
|
|
|