summary refs log tree commit diff
path: root/lib/all-mills.fnl
blob: 562bb97eb53c7646aedac024ebe8098b7b5baf18 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
(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?
 }