linked-list.fnl
Branches > main > 829c2fd > files / nvim / pack / plugins / opt / conjure / fnl / conjure / linked-list.fnl
(local {: autoload : define} (require :conjure.nfnl.module))
(local core (autoload :conjure.nfnl.core))
(local M (define :conjure.linked-list))
(fn M.create [xs prev]
(when (not (core.empty? xs))
(let [rest (core.rest xs)
node {}]
(core.assoc node :val (core.first xs))
(core.assoc node :prev prev)
(core.assoc node :next (M.create rest node)))))
(fn M.val [l]
(-?> l (core.get :val)))
(fn M.next [l]
(-?> l (core.get :next)))
(fn M.prev [l]
(-?> l (core.get :prev)))
(fn M.first [l]
(var c l)
(while (M.prev c)
(set c (M.prev c)))
c)
(fn M.last [l]
(var c l)
(while (M.next c)
(set c (M.next c)))
c)
(fn M.until [f l]
(var c l)
(var r false)
(fn step []
(set r (f c))
r)
(while (and c (not (step)))
(set c (M.next c)))
(when r
c))
(fn M.cycle [l]
(let [start (M.first l)
end (M.last l)]
(core.assoc start :prev end)
(core.assoc end :next start)
l))
M