(local {: mill-at? } (require :lib.game.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? [player moves] (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] (->> current-player (toggle-player) (only-player-moves all-moves) (all-moves-are-mills? current-player))) {: all-mills? ;; do not use; just for testing: : toggle-player : only-player-moves : all-moves-are-mills? }