module LayoutDir where
import Geometry(Point(..), xcoord, ycoord)
import LayoutRequest
import Utils(swap)

data Orientation = Above | Below | RightOf | LeftOf
                   deriving (Orientation -> Orientation -> Bool
(Orientation -> Orientation -> Bool)
-> (Orientation -> Orientation -> Bool) -> Eq Orientation
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Orientation -> Orientation -> Bool
$c/= :: Orientation -> Orientation -> Bool
== :: Orientation -> Orientation -> Bool
$c== :: Orientation -> Orientation -> Bool
Eq, Eq Orientation
Eq Orientation
-> (Orientation -> Orientation -> Ordering)
-> (Orientation -> Orientation -> Bool)
-> (Orientation -> Orientation -> Bool)
-> (Orientation -> Orientation -> Bool)
-> (Orientation -> Orientation -> Bool)
-> (Orientation -> Orientation -> Orientation)
-> (Orientation -> Orientation -> Orientation)
-> Ord Orientation
Orientation -> Orientation -> Bool
Orientation -> Orientation -> Ordering
Orientation -> Orientation -> Orientation
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Orientation -> Orientation -> Orientation
$cmin :: Orientation -> Orientation -> Orientation
max :: Orientation -> Orientation -> Orientation
$cmax :: Orientation -> Orientation -> Orientation
>= :: Orientation -> Orientation -> Bool
$c>= :: Orientation -> Orientation -> Bool
> :: Orientation -> Orientation -> Bool
$c> :: Orientation -> Orientation -> Bool
<= :: Orientation -> Orientation -> Bool
$c<= :: Orientation -> Orientation -> Bool
< :: Orientation -> Orientation -> Bool
$c< :: Orientation -> Orientation -> Bool
compare :: Orientation -> Orientation -> Ordering
$ccompare :: Orientation -> Orientation -> Ordering
$cp1Ord :: Eq Orientation
Ord, Int -> Orientation -> ShowS
[Orientation] -> ShowS
Orientation -> String
(Int -> Orientation -> ShowS)
-> (Orientation -> String)
-> ([Orientation] -> ShowS)
-> Show Orientation
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Orientation] -> ShowS
$cshowList :: [Orientation] -> ShowS
show :: Orientation -> String
$cshow :: Orientation -> String
showsPrec :: Int -> Orientation -> ShowS
$cshowsPrec :: Int -> Orientation -> ShowS
Show)

data LayoutDir = Horizontal | Vertical  deriving (LayoutDir -> LayoutDir -> Bool
(LayoutDir -> LayoutDir -> Bool)
-> (LayoutDir -> LayoutDir -> Bool) -> Eq LayoutDir
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: LayoutDir -> LayoutDir -> Bool
$c/= :: LayoutDir -> LayoutDir -> Bool
== :: LayoutDir -> LayoutDir -> Bool
$c== :: LayoutDir -> LayoutDir -> Bool
Eq, Eq LayoutDir
Eq LayoutDir
-> (LayoutDir -> LayoutDir -> Ordering)
-> (LayoutDir -> LayoutDir -> Bool)
-> (LayoutDir -> LayoutDir -> Bool)
-> (LayoutDir -> LayoutDir -> Bool)
-> (LayoutDir -> LayoutDir -> Bool)
-> (LayoutDir -> LayoutDir -> LayoutDir)
-> (LayoutDir -> LayoutDir -> LayoutDir)
-> Ord LayoutDir
LayoutDir -> LayoutDir -> Bool
LayoutDir -> LayoutDir -> Ordering
LayoutDir -> LayoutDir -> LayoutDir
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: LayoutDir -> LayoutDir -> LayoutDir
$cmin :: LayoutDir -> LayoutDir -> LayoutDir
max :: LayoutDir -> LayoutDir -> LayoutDir
$cmax :: LayoutDir -> LayoutDir -> LayoutDir
>= :: LayoutDir -> LayoutDir -> Bool
$c>= :: LayoutDir -> LayoutDir -> Bool
> :: LayoutDir -> LayoutDir -> Bool
$c> :: LayoutDir -> LayoutDir -> Bool
<= :: LayoutDir -> LayoutDir -> Bool
$c<= :: LayoutDir -> LayoutDir -> Bool
< :: LayoutDir -> LayoutDir -> Bool
$c< :: LayoutDir -> LayoutDir -> Bool
compare :: LayoutDir -> LayoutDir -> Ordering
$ccompare :: LayoutDir -> LayoutDir -> Ordering
$cp1Ord :: Eq LayoutDir
Ord, Int -> LayoutDir -> ShowS
[LayoutDir] -> ShowS
LayoutDir -> String
(Int -> LayoutDir -> ShowS)
-> (LayoutDir -> String)
-> ([LayoutDir] -> ShowS)
-> Show LayoutDir
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [LayoutDir] -> ShowS
$cshowList :: [LayoutDir] -> ShowS
show :: LayoutDir -> String
$cshow :: LayoutDir -> String
showsPrec :: Int -> LayoutDir -> ShowS
$cshowsPrec :: Int -> LayoutDir -> ShowS
Show)


xc :: LayoutDir -> Point -> Int
xc LayoutDir
Horizontal = Point -> Int
xcoord
xc LayoutDir
Vertical = Point -> Int
ycoord

yc :: LayoutDir -> Point -> Int
yc LayoutDir
Horizontal = Point -> Int
ycoord
yc LayoutDir
Vertical = Point -> Int
xcoord

fixh :: LayoutDir -> LayoutRequest -> Bool
fixh LayoutDir
Horizontal = LayoutRequest -> Bool
fixedh
fixh LayoutDir
Vertical = LayoutRequest -> Bool
fixedv

fixv :: LayoutDir -> LayoutRequest -> Bool
fixv LayoutDir
Horizontal = LayoutRequest -> Bool
fixedv
fixv LayoutDir
Vertical = LayoutRequest -> Bool
fixedh

mkp :: LayoutDir -> Int -> Int -> Point
mkp LayoutDir
Horizontal Int
x Int
y = Int -> Int -> Point
Point Int
x Int
y
mkp LayoutDir
Vertical Int
x Int
y = Int -> Int -> Point
Point Int
y Int
x

vswap :: LayoutDir -> (b, b) -> (b, b)
vswap LayoutDir
Horizontal = (b, b) -> (b, b)
forall a. a -> a
id
vswap LayoutDir
Vertical = (b, b) -> (b, b)
forall b a. (b, a) -> (a, b)
swap

colinear :: LayoutDir -> p -> p -> p
colinear LayoutDir
Horizontal p
h p
v = p
h
colinear LayoutDir
Vertical   p
h p
v = p
v

orthogonal :: LayoutDir -> p -> p -> p
orthogonal LayoutDir
Horizontal p
h p
v = p
v
orthogonal LayoutDir
Vertical   p
h p
v = p
h