module BishBosh.Cartesian.Abscissa(
ByAbscissa,
xOrigin,
xLength,
xMin,
xMax,
xRange,
centre,
reflect,
translate,
maybeTranslate,
getAdjacents,
listArrayByAbscissa,
inBounds
) where
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
centre :: Fractional centre => centre
centre :: centre
centre = Int -> centre
forall a b. (Integral a, Num b) => a -> b
fromIntegral ((Int -> Int -> Int) -> (Int, Int) -> Int
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry Int -> Int -> Int
forall a. Num a => a -> a -> a
(+) (Int, Int)
forall x. Enum x => (x, x)
xBounds :: T.X) centre -> centre -> centre
forall a. Fractional a => a -> a -> a
/ centre
2
reflect :: Enum x => x -> x
reflect :: x -> x
reflect = Int -> x
forall a. Enum a => Int -> a
toEnum (Int -> x) -> (x -> Int) -> x -> x
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (
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) -> (x -> Int) -> x -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Int
forall a. Num a => a -> a
negate (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
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
x]
| 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
x]
| 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 ByAbscissa 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