module BishBosh.Cartesian.Abscissa(
ArrayByAbscissa,
xOrigin,
xLength,
xMin,
xMax,
xBounds,
xRange,
toIx,
fromIx,
reflect,
translate,
maybeTranslate,
getAdjacents,
listArrayByAbscissa,
inBounds
) where
import qualified BishBosh.Data.Enum as Data.Enum
import qualified BishBosh.Types as T
import qualified Control.Exception
import qualified Data.Array.IArray
xOrigin :: Int
xOrigin :: Int
xOrigin = Int
0
xLength :: T.Distance
xLength :: Int
xLength = Int
8
xMin :: Enum x => x
xMin :: x
xMin = Int -> x
forall a. Enum a => Int -> a
toEnum Int
xOrigin
xMax :: Enum x => x
xMax :: x
xMax = Int -> x
forall a. Enum a => Int -> a
toEnum (Int -> x) -> Int -> x
forall a b. (a -> b) -> a -> b
$ Int
xOrigin Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Int
forall a. Enum a => a -> a
pred Int
xLength)
xBounds :: Enum x => (x, x)
xBounds :: (x, x)
xBounds = (x
forall x. Enum x => x
xMin, x
forall x. Enum x => x
xMax)
xRange :: Enum x => [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)
forall x. Enum x => (x, x)
xBounds
toIx :: Enum x => x -> Int
{-# INLINE toIx #-}
toIx :: x -> Int
toIx = Int -> Int -> Int
forall a. Num a => a -> a -> a
subtract Int
xOrigin (Int -> Int) -> (x -> Int) -> x -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. x -> Int
forall a. Enum a => a -> Int
fromEnum
fromIx :: Enum x => Int -> x
{-# INLINE fromIx #-}
fromIx :: Int -> x
fromIx = Int -> x
forall a. Enum a => Int -> a
toEnum (Int -> x) -> (Int -> Int) -> Int -> x
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
xOrigin)
reflect :: Enum x => x -> x
reflect :: x -> x
reflect = (Int -> Int) -> x -> x
forall a b. (Enum a, Enum b) => (Int -> Int) -> a -> b
Data.Enum.translate ((Int -> Int) -> x -> x) -> (Int -> Int) -> x -> x
forall a b. (a -> b) -> a -> b
$ (
Int -> Int -> Int
forall a. Num a => a -> a -> a
+ (Int
2 Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
xOrigin Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Int
forall a. Enum a => a -> a
pred Int
xLength))
) (Int -> Int) -> (Int -> Int) -> Int -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Int
forall a. Num a => a -> a
negate
inBounds :: (Enum x, Ord x) => x -> Bool
{-# INLINE inBounds #-}
inBounds :: x -> Bool
inBounds x
x = x
x x -> x -> Bool
forall a. Ord a => a -> a -> Bool
>= x
forall x. Enum x => x
xMin Bool -> Bool -> Bool
&& x
x x -> x -> Bool
forall a. Ord a => a -> a -> Bool
<= x
forall x. Enum x => x
xMax
translate :: (Enum x, Ord x) => (x -> x) -> x -> 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
forall x. (Enum x, Ord x) => 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 :: (Enum x, Ord x) => (x -> x) -> x -> Maybe x
maybeTranslate :: (x -> x) -> x -> Maybe x
maybeTranslate x -> x
transformation = (
\x
x -> if x -> Bool
forall x. (Enum x, Ord x) => 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 :: (Enum x, Eq x) => x -> [x]
{-# INLINE getAdjacents #-}
getAdjacents :: x -> [x]
getAdjacents x
x
| x
x x -> x -> Bool
forall a. Eq a => a -> a -> Bool
== x
forall x. Enum x => x
xMin = [x -> x
forall a. Enum a => a -> a
succ x
forall x. Enum x => x
xMin]
| x
x x -> x -> Bool
forall a. Eq a => a -> a -> Bool
== x
forall x. Enum x => x
xMax = [x -> x
forall a. Enum a => a -> a
pred x
forall x. Enum x => 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]
type ArrayByAbscissa x = Data.Array.IArray.Array x
listArrayByAbscissa :: (
Data.Array.IArray.IArray a e,
Data.Array.IArray.Ix x,
Enum x
) => [e] -> a 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)
forall x. Enum x => (x, x)
xBounds