summaryrefslogtreecommitdiff
path: root/lib/table.fnl
diff options
context:
space:
mode:
Diffstat (limited to 'lib/table.fnl')
-rw-r--r--lib/table.fnl50
1 files changed, 42 insertions, 8 deletions
diff --git a/lib/table.fnl b/lib/table.fnl
index f40c299..276e12d 100644
--- a/lib/table.fnl
+++ b/lib/table.fnl
@@ -1,16 +1,50 @@
-(local {: contains} (require :lib.contains))
-(local {: head} (require :lib.head))
-(local {: keys} (require :lib.keys))
-(local {:kvflip invert} (require :lib.kvflip))
-(local {:pprint print} (require :lib.tableprint))
-(local {: slice} (require :lib.slice))
-(local {: tail} (require :lib.tail))
+;; 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
- : invert
: print
: slice
: tail