9mm/lib/mill.fnl

43 lines
1.2 KiB
Fennel

(local {: contains} (require :lib.contains))
(fn get-candidates [all-mills next-move]
"a list of mills that contain next-move"
(icollect [_ mill (ipairs all-mills)] (if (contains mill next-move) mill)))
(fn any [t]
"take a list of booleans, returns true if any of them are true"
(accumulate [acc false
i x (ipairs t)]
(or acc x)))
(fn move-mills [moves-list]
(icollect [_ moves (ipairs moves-list)]
(let [player (. moves 1)]
(accumulate [acc true
_ m (ipairs moves)]
(and acc (not= m 0) (= player m))))))
(fn candidate-moves [candidates moves]
"Just turning board spaces into player moves"
(icollect [_ spaces (ipairs candidates)]
(icollect [_ space (ipairs spaces)]
(. moves space))))
(fn mill-at? [all-mills current-moves move]
"Is there a mill at this move?"
(let [candidates (get-candidates all-mills move)
my-moves (candidate-moves candidates current-moves)
my-mills (move-mills my-moves)
result (any my-mills)
]
result))
{: mill-at?
;; not for consumption,
;; just for testing:
: get-candidates
: candidate-moves
: move-mills
: any
}