summary refs log tree commit diff
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