module BishBosh.Cartesian.Abscissa(
xLength,
xMin,
xMax,
xBounds,
xRange,
bishopsFiles,
kingsFile,
toIx,
fromIx,
reflect,
translate,
maybeTranslate,
getAdjacents,
listArrayByAbscissa,
inBounds
) where
import Data.Array.IArray((!))
import qualified BishBosh.Type.Length as Type.Length
import qualified Control.Exception
import qualified Data.Array.IArray
xLength :: Type.Length.X
xLength :: X
xLength = X
8
xBounds :: (Type.Length.X, Type.Length.X)
xMin, xMax :: Type.Length.X
xBounds :: (X, X)
xBounds@(X
xMin, X
xMax) = (X
0, X
xMin X -> X -> X
forall a. Num a => a -> a -> a
+ X -> X
forall a. Enum a => a -> a
pred X
xLength)
xRange :: [Type.Length.X]
xRange :: [X]
xRange = (X -> X -> [X]) -> (X, X) -> [X]
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry X -> X -> [X]
forall a. Enum a => a -> a -> [a]
enumFromTo (X, X)
xBounds
bishopsFiles :: [Type.Length.X]
bishopsFiles :: [X]
bishopsFiles = (X -> X) -> [X] -> [X]
forall a b. (a -> b) -> [a] -> [b]
map X -> X
fromIx [X
2, X
5]
kingsFile :: Type.Length.X
kingsFile :: X
kingsFile = X -> X
fromIx X
4
toIx :: Type.Length.X -> Int
{-# INLINE toIx #-}
toIx :: X -> X
toIx = X -> X
forall a b. (Integral a, Num b) => a -> b
fromIntegral (X -> X) -> (X -> X) -> X -> X
forall b c a. (b -> c) -> (a -> b) -> a -> c
. X -> X -> X
forall a. Num a => a -> a -> a
subtract X
xMin
fromIx :: Int -> Type.Length.X
{-# INLINE fromIx #-}
fromIx :: X -> X
fromIx = (X -> X -> X
forall a. Num a => a -> a -> a
+ X
xMin) (X -> X) -> (X -> X) -> X -> X
forall b c a. (b -> c) -> (a -> b) -> a -> c
. X -> X
forall a b. (Integral a, Num b) => a -> b
fromIntegral
reflect :: Type.Length.X -> Type.Length.X
reflect :: X -> X
reflect = (
X -> X -> X
forall a. Num a => a -> a -> a
+ (X
2 X -> X -> X
forall a. Num a => a -> a -> a
* X
xMin X -> X -> X
forall a. Num a => a -> a -> a
+ X -> X
forall a. Enum a => a -> a
pred X
xLength)
) (X -> X) -> (X -> X) -> X -> X
forall b c a. (b -> c) -> (a -> b) -> a -> c
. X -> X
forall a. Num a => a -> a
negate
inBounds :: Type.Length.X -> Bool
{-# INLINE inBounds #-}
inBounds :: X -> Bool
inBounds X
x = X
x X -> X -> Bool
forall a. Ord a => a -> a -> Bool
>= X
xMin Bool -> Bool -> Bool
&& X
x X -> X -> Bool
forall a. Ord a => a -> a -> Bool
<= X
xMax
translate :: (Type.Length.X -> Type.Length.X) -> Type.Length.X -> Type.Length.X
translate :: (X -> X) -> X -> X
translate X -> X
transformation = (\X
x -> Bool -> X -> X
forall a. (?callStack::CallStack) => Bool -> a -> a
Control.Exception.assert (X -> Bool
inBounds X
x) X
x) (X -> X) -> (X -> X) -> X -> X
forall b c a. (b -> c) -> (a -> b) -> a -> c
. X -> X
transformation
maybeTranslate :: (Type.Length.X -> Type.Length.X) -> Type.Length.X -> Maybe Type.Length.X
maybeTranslate :: (X -> X) -> X -> Maybe X
maybeTranslate X -> X
transformation = (
\X
x -> if X -> Bool
inBounds X
x
then X -> Maybe X
forall a. a -> Maybe a
Just X
x
else Maybe X
forall a. Maybe a
Nothing
) (X -> Maybe X) -> (X -> X) -> X -> Maybe X
forall b c a. (b -> c) -> (a -> b) -> a -> c
. X -> X
transformation
getAdjacents' :: Type.Length.X -> [Type.Length.X]
getAdjacents' :: X -> [X]
getAdjacents' X
x
| X
x X -> X -> Bool
forall a. Eq a => a -> a -> Bool
== X
xMin = [X -> X
forall a. Enum a => a -> a
succ X
xMin]
| X
x X -> X -> Bool
forall a. Eq a => a -> a -> Bool
== X
xMax = [X -> X
forall a. Enum a => a -> a
pred X
xMax]
| Bool
otherwise = [X -> X
forall a. Enum a => a -> a
pred X
x, X -> X
forall a. Enum a => a -> a
succ X
x]
adjacents :: Data.Array.IArray.Array Type.Length.X [Type.Length.X]
adjacents :: Array X [X]
adjacents = [[X]] -> Array X [X]
forall (a :: * -> * -> *) e. IArray a e => [e] -> a X e
listArrayByAbscissa ([[X]] -> Array X [X]) -> [[X]] -> Array X [X]
forall a b. (a -> b) -> a -> b
$ (X -> [X]) -> [X] -> [[X]]
forall a b. (a -> b) -> [a] -> [b]
map X -> [X]
getAdjacents' [X]
xRange
getAdjacents :: Type.Length.X -> [Type.Length.X]
getAdjacents :: X -> [X]
getAdjacents = (Array X [X]
adjacents Array X [X] -> X -> [X]
forall (a :: * -> * -> *) e i.
(IArray a e, Ix i) =>
a i e -> i -> e
!)
listArrayByAbscissa :: Data.Array.IArray.IArray a e => [e] -> a Type.Length.X e
listArrayByAbscissa :: [e] -> a X e
listArrayByAbscissa = (X, X) -> [e] -> a X e
forall (a :: * -> * -> *) e i.
(IArray a e, Ix i) =>
(i, i) -> [e] -> a i e
Data.Array.IArray.listArray (X, X)
xBounds