(local {: mill-at? } (require :lib.mill)) (local {: mills } (require :lib.constants)) (fn toggle-player [p] (if (= p 1) 2 1)) (fn only-player-moves [moves player] (icollect [_ move (ipairs moves)] (if (= move player) player 0))) (fn all-moves-are-mills? [moves player] (accumulate [result true i m (ipairs moves) ] (and result (if (= m 0) true (mill-at? mills moves i))))) (fn all-mills? [all-moves current-player] (let [next-player (toggle-player current-player) player-moves (only-player-moves all-moves next-player) all-mills (all-moves-are-mills? player-moves current-player)] all-mills)) {: all-mills? ;; do not use; just for testing: : toggle-player : only-player-moves : all-moves-are-mills? }