(local {: tail} (require :lib.tail)) (fn get-player-idxs [player moves] (icollect [i p (ipairs moves)] (when (= p player) i))) (fn idx-to-neighbors [idxs all-neighbors] (icollect [_ i (ipairs idxs)] (tail (. all-neighbors i)))) (fn neighbor-is-occupied? [neighbors moves] (icollect [_ move (ipairs neighbors)] (icollect [_ neighbor (ipairs move)] (not= (. moves neighbor) 0)))) (fn reduce-to-bool [xs] (accumulate [acc true _ x (ipairs xs)] (and x))) (fn no-moves? [neighbors all-moves player] (-> (get-player-idxs player all-moves) (idx-to-neighbors neighbors) (neighbor-is-occupied? all-moves) (reduce-to-bool) (reduce-to-bool))) {: no-moves? }