Skip to content

Instantly share code, notes, and snippets.

@disco0
Forked from leo60228/iter.fnl
Last active November 2, 2021 08:02
Show Gist options
  • Save disco0/e51e1f8eaa4ed8c53f04ec181a9f9f66 to your computer and use it in GitHub Desktop.
Save disco0/e51e1f8eaa4ed8c53f04ec181a9f9f66 to your computer and use it in GitHub Desktop.
; 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