summaryrefslogtreecommitdiff
path: root/dot_config/nvim/fnl/toast
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--dot_config/nvim/fnl/toast/core.fnl55
-rw-r--r--dot_config/nvim/fnl/toast/macros.fnl7
-rw-r--r--dot_config/nvim/fnl/toast/table.fnl5
3 files changed, 53 insertions, 14 deletions
diff --git a/dot_config/nvim/fnl/toast/core.fnl b/dot_config/nvim/fnl/toast/core.fnl
index 3c77e4a..16e69c2 100644
--- a/dot_config/nvim/fnl/toast/core.fnl
+++ b/dot_config/nvim/fnl/toast/core.fnl
@@ -1,20 +1,31 @@
-(local {: insert} (require :toast.table))
+(local {: insert : unpack} (require :toast.table))
+; math
(fn dec [n]
"Decrement n by 1."
(- n 1))
(fn inc [n]
"Increment n by 1."
(+ n 1))
+
+; checks?
+(fn empty? [xs]
+ "Returns true if the lengthable contains no elements."
+ (= 0 (length xs)))
+(fn nil? [x]
+ "Returns true if the argument is nil."
+ (= nil x))
+(fn number? [n]
+ "Returns true if the argument is a number."
+ (= :number (type n)))
+
+; sequences
(fn drop [n xs]
"Returns a table of all but the first n elements in xs."
(let [out []]
(each [i v (ipairs xs)]
(when (> i n) (insert out v)))
out))
-(fn empty? [xs]
- "Returns true if the lengthable contains no elements."
- (= 0 (length xs)))
(fn first [xs]
"The first element in a sequential table."
(. xs 1))
@@ -36,19 +47,45 @@
(insert out []))
(insert (last out) v
out))))))
+
+; HOF
+(fn assoc [?t ...]
+ "Sets the key `k` in table `t` to the value `v`.
+ Accepts an arbitrary amount of `k` and `v` pairs.
+ Returns the mutated table `t`."
+ (let [t (or ?t {})
+ lt (inc (length t)) ; for numerical keys
+ [k v & xs] [...]]
+ (case k
+ nil nil
+ (where k (and (number? k) (> lt k))) (tset t k v) ; TODO: (set (. t k) v)
+ (where k (and (number? k) (= k lt))) (table.insert t k v)
+ _ (tset t k v))
+ (case (length xs)
+ 0 t
+ 1 (error "assoc expects even number of arguments after table, found odd number")
+ _ (assoc t (unpack xs)))))
(fn map [f xs]
"Returns a sequential table consisting of the result of apply f to every item in xs."
(accumulate [out []
- _ v (ipairs xs)]
+ _ v (ipairs (or xs []))]
(let [mapped (f v)]
(insert out (if (= 0 (select :# mapped))
nil
mapped)))))
-{: dec
+{;math
+ : dec
: inc
- : drop
+ ; checks?
: empty?
- : group
+ : nil?
+ : number?
+ ; sequences
+ : drop
: first
- : last}
+ : last
+ : group
+ ; HOF
+ : assoc
+ : map}
diff --git a/dot_config/nvim/fnl/toast/macros.fnl b/dot_config/nvim/fnl/toast/macros.fnl
index bb4375b..b81d8e6 100644
--- a/dot_config/nvim/fnl/toast/macros.fnl
+++ b/dot_config/nvim/fnl/toast/macros.fnl
@@ -2,9 +2,8 @@
(local {: inc
: drop
- : group} (require :toast.core))
-(local {: from-pairs
- : insert} (require :toast.table))
+ : assoc} (require :toast.core))
+(local {: insert} (require :toast.table))
(fn tbl [...]
"Generate a mixed table.
@@ -16,7 +15,7 @@
&until (= v '&)]
(insert out v))
post (drop (inc (length pre)) args)]
- (from-pairs (group 2 post) pre)))
+ (assoc pre (unpack post))))
(fn recc [reqspec key ...]
"A common lua pattern is `require 'something'.call(arg1, arg2)`.
diff --git a/dot_config/nvim/fnl/toast/table.fnl b/dot_config/nvim/fnl/toast/table.fnl
index a294b14..fe118e8 100644
--- a/dot_config/nvim/fnl/toast/table.fnl
+++ b/dot_config/nvim/fnl/toast/table.fnl
@@ -11,5 +11,8 @@
(table.insert t ...)
t)
+(local unpack (or table.unpack unpack))
+
{: from-pairs
- : insert}
+ : insert
+ : unpack}