-
-
Save disco0/e51e1f8eaa4ed8c53f04ec181a9f9f66 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
; vim:set ft=fnl: | |
(fn filter-map [pred iter inv start-control] | |
(var control start-control) | |
(fn filter-map-inter [] | |
(let [(new-control value) (iter inv control)] | |
(set control new-control) | |
(if (= value nil) | |
nil | |
; else | |
(let [mapped (pred value)] | |
(if (= mapped nil) | |
(filter-map-inter) | |
(values control mapped.v))))))) | |
(fn filter [pred iter inv control] | |
(filter-map | |
#(when (pred $) { :v $ }) | |
iter inv control)) | |
(fn map [pred iter inv control] | |
(filter-map | |
#{ :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 col [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 | |
; else | |
(foldl pred (pred state value) iter inv control)))) | |
{ : filter-map | |
: filter | |
: map | |
: head | |
: first | |
: col | |
: foldl | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment