cons-lists/src/reduce.coffee

61 lines
1.2 KiB
CoffeeScript

{car, cdr, cons, listp, pairp, nilp,
nil, list, listToString} = require './lists'
length = (lst, l = 0) ->
return l if (nilp lst)
length (cdr lst), (l + 1)
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) ->
ptr = lst
ret = cons()
while not nilp ptr
ret = cons (car ptr), ret
ptr = cdr ptr
ret
reverse = (lst) -> rmap lst, (i) -> i
filter = (lst, iteratee, context) ->
return nil if nilp lst
if iteratee.call(context, (car lst), lst)
cons (car lst), (filter (cdr lst), iteratee, context)
else
filter (cdr lst), iteratee, context
module.exports =
length: length
reduce: reduce
map: map
rmap: rmap
filter: filter
reverse: reverse