52 lines
978 B
Fennel
52 lines
978 B
Fennel
;; table funs
|
|
|
|
(fn contains [t x]
|
|
"does table t contain element x?"
|
|
(accumulate [found false
|
|
_ v (ipairs t)
|
|
&until found] ; escape early
|
|
(or found (= x v))))
|
|
|
|
(fn head [t]
|
|
"return the first item in a table"
|
|
(if (> (length t) 0)
|
|
(?. t 1)
|
|
[]))
|
|
|
|
(fn tail [t]
|
|
"return the table minus the head"
|
|
(icollect [i v (ipairs t)]
|
|
(if (> i 1)
|
|
v)))
|
|
|
|
(fn keys [t]
|
|
"takes a table returns a sequential list of its keys"
|
|
(local out [])
|
|
(each [k v (pairs t)] (table.insert out k))
|
|
out)
|
|
|
|
(fn flip [t]
|
|
"takes a table of {key value} and returns a table of {value key}"
|
|
(collect [k v (pairs t)] (values v k)))
|
|
|
|
(fn print [tbl]
|
|
"print a table"
|
|
(each [k v (pairs tbl)]
|
|
(let [table? (= (type v) :table)]
|
|
(print k v))))
|
|
|
|
(fn slice [t start stop]
|
|
"return a slice of a table"
|
|
(fcollect [i start (or stop (length t))]
|
|
(. t i)))
|
|
|
|
{
|
|
: contains
|
|
: flip
|
|
: head
|
|
: keys
|
|
: print
|
|
: slice
|
|
: tail
|
|
}
|