minesweeper-0.8.9: Core/Constraints.lhs
-- | Core data type for the game.
> module Core.Constraints
> ( Constraints
> , initConstraints
> , setSum
> , solutions
> , distribution
> , clearProb
> ) where
> import Data.SetClass (fromList, size)
> import Core.Square
> import Core.BitField
> import Core.SetContainer
> import Core.Constraint
--------------------------------
> type Constraints
> = CachedSize
> (Maybe
> (EitherC Clear
> (EitherC Bomb
> [Constraint SquareSet]
> )
> )
> )
> solutions :: Constraints -> Integer
> solutions = numOfLayouts
> setSum :: SquareSet -> Int -> Constraints -> Constraints
> setSum ps v c
> = addConstraint ps v c
> initConstraints :: Board -> Int -> Constraints
> initConstraints s m
> = newLayout (squares s) m
> clearProb :: Square -> Constraints -> Rational
> clearProb p g
> = fromIntegral (solutions $ setSum (fromList [p]) 0 g) / fromIntegral (solutions g)
> distribution :: SquareSet -> Constraints -> [Constraints]
> distribution ps cs
> = at ((/=0) . solutions)
> (takeWhile ((/=0) . solutions))
> [setSum ps i cs | i<-[0..size ps]]
Auxiliary
---------
> foldrUntil :: (a -> Bool) -> (a -> b -> b) -> ([a] -> b) -> [a] -> b
> foldrUntil p c n (x:xs) | p x = x `c` foldrUntil p c n xs
> foldrUntil _ _ n xs = n xs
> at :: (a -> Bool) -> ([a] -> [a]) -> [a] -> [a]
> at p = foldrUntil (not . p) (:)