module BishBosh.Property.Orientated (
Orientated(..)
) where
import Control.Arrow((&&&), (|||))
class Orientated a where
isVertical :: a -> Bool
isVertical = (Bool -> Bool -> Bool) -> (Bool, Bool) -> Bool
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry Bool -> Bool -> Bool
(&&) ((Bool, Bool) -> Bool) -> (a -> (Bool, Bool)) -> a -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> Bool
forall a. Orientated a => a -> Bool
isParallel (a -> Bool) -> (a -> Bool) -> a -> (Bool, Bool)
forall (a :: * -> * -> *) b c c'.
Arrow a =>
a b c -> a b c' -> a b (c, c')
&&& Bool -> Bool
not (Bool -> Bool) -> (a -> Bool) -> a -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Bool
forall a. Orientated a => a -> Bool
isHorizontal)
isHorizontal :: a -> Bool
isHorizontal = (Bool -> Bool -> Bool) -> (Bool, Bool) -> Bool
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry Bool -> Bool -> Bool
(&&) ((Bool, Bool) -> Bool) -> (a -> (Bool, Bool)) -> a -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> Bool
forall a. Orientated a => a -> Bool
isParallel (a -> Bool) -> (a -> Bool) -> a -> (Bool, Bool)
forall (a :: * -> * -> *) b c c'.
Arrow a =>
a b c -> a b c' -> a b (c, c')
&&& Bool -> Bool
not (Bool -> Bool) -> (a -> Bool) -> a -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Bool
forall a. Orientated a => a -> Bool
isVertical)
isParallel :: a -> Bool
isParallel = (Bool -> Bool -> Bool) -> (Bool, Bool) -> Bool
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry Bool -> Bool -> Bool
(||) ((Bool, Bool) -> Bool) -> (a -> (Bool, Bool)) -> a -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> Bool
forall a. Orientated a => a -> Bool
isVertical (a -> Bool) -> (a -> Bool) -> a -> (Bool, Bool)
forall (a :: * -> * -> *) b c c'.
Arrow a =>
a b c -> a b c' -> a b (c, c')
&&& a -> Bool
forall a. Orientated a => a -> Bool
isHorizontal)
isDiagonal :: a -> Bool
isDiagonal = (Bool -> Bool -> Bool) -> (Bool, Bool) -> Bool
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry Bool -> Bool -> Bool
(&&) ((Bool, Bool) -> Bool) -> (a -> (Bool, Bool)) -> a -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> Bool
forall a. Orientated a => a -> Bool
isStraight (a -> Bool) -> (a -> Bool) -> a -> (Bool, Bool)
forall (a :: * -> * -> *) b c c'.
Arrow a =>
a b c -> a b c' -> a b (c, c')
&&& Bool -> Bool
not (Bool -> Bool) -> (a -> Bool) -> a -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Bool
forall a. Orientated a => a -> Bool
isParallel)
isStraight :: a -> Bool
isStraight = (Bool -> Bool -> Bool) -> (Bool, Bool) -> Bool
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry Bool -> Bool -> Bool
(||) ((Bool, Bool) -> Bool) -> (a -> (Bool, Bool)) -> a -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> Bool
forall a. Orientated a => a -> Bool
isParallel (a -> Bool) -> (a -> Bool) -> a -> (Bool, Bool)
forall (a :: * -> * -> *) b c c'.
Arrow a =>
a b c -> a b c' -> a b (c, c')
&&& a -> Bool
forall a. Orientated a => a -> Bool
isDiagonal)
instance (Orientated l, Orientated r) => Orientated (Either l r) where
isVertical :: Either l r -> Bool
isVertical = l -> Bool
forall a. Orientated a => a -> Bool
isVertical (l -> Bool) -> (r -> Bool) -> Either l r -> Bool
forall (a :: * -> * -> *) b d c.
ArrowChoice a =>
a b d -> a c d -> a (Either b c) d
||| r -> Bool
forall a. Orientated a => a -> Bool
isVertical
isHorizontal :: Either l r -> Bool
isHorizontal = l -> Bool
forall a. Orientated a => a -> Bool
isHorizontal (l -> Bool) -> (r -> Bool) -> Either l r -> Bool
forall (a :: * -> * -> *) b d c.
ArrowChoice a =>
a b d -> a c d -> a (Either b c) d
||| r -> Bool
forall a. Orientated a => a -> Bool
isHorizontal
isDiagonal :: Either l r -> Bool
isDiagonal = l -> Bool
forall a. Orientated a => a -> Bool
isDiagonal (l -> Bool) -> (r -> Bool) -> Either l r -> Bool
forall (a :: * -> * -> *) b d c.
ArrowChoice a =>
a b d -> a c d -> a (Either b c) d
||| r -> Bool
forall a. Orientated a => a -> Bool
isDiagonal
isParallel :: Either l r -> Bool
isParallel = l -> Bool
forall a. Orientated a => a -> Bool
isParallel (l -> Bool) -> (r -> Bool) -> Either l r -> Bool
forall (a :: * -> * -> *) b d c.
ArrowChoice a =>
a b d -> a c d -> a (Either b c) d
||| r -> Bool
forall a. Orientated a => a -> Bool
isParallel
isStraight :: Either l r -> Bool
isStraight = l -> Bool
forall a. Orientated a => a -> Bool
isStraight (l -> Bool) -> (r -> Bool) -> Either l r -> Bool
forall (a :: * -> * -> *) b d c.
ArrowChoice a =>
a b d -> a c d -> a (Either b c) d
||| r -> Bool
forall a. Orientated a => a -> Bool
isStraight