Skip to content

Instantly share code, notes, and snippets.

@leo60228
Last active June 9, 2021 06:57
Show Gist options
  • Save leo60228/9813228fc143f481bba264a8757d2962 to your computer and use it in GitHub Desktop.
Save leo60228/9813228fc143f481bba264a8757d2962 to your computer and use it in GitHub Desktop.
; vim:set ft=lisp:
(fn filterMap [pred iter inv startControl]
(var control startControl)
(fn filterMapIter []
(let [(newControl value) (iter inv control)]
(set control newControl)
(if (= value nil)
nil
(let [mapped (pred value)]
(if (= mapped nil)
(filterMapIter)
(values control mapped.v)))))))
(fn filter [pred iter inv control]
(filterMap
#(when (pred $) {"v" $})
iter inv control))
(fn map [pred iter inv control]
(filterMap
#{"v" (pred $)}
iter inv control))
(fn head [iter inv control]
(let [(control value) (iter inv control)]
value))
(fn first [pred iter inv control]
(head (filter pred iter inv control)))
(fn collect [iter inv control]
(local tbl {})
(each [control value (values iter inv control)]
(table.insert tbl value))
tbl)
(fn foldl [pred state iter inv control]
(let [(control value) (iter inv control)]
(if (= value nil)
state
(foldl pred (pred state value) iter inv control))))
{"filterMap" filterMap "filter" filter "map" map "head" head "first" first "collect" collect "foldl" foldl}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment