-- | 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) (:)