module Geomancy.Layout.Alignment where

import Geomancy

-- | @left/center/right@ & @top/middle/bottom@
type Alignment = Vec2

leftTop :: Alignment
leftTop :: Alignment
leftTop = Float -> Float -> Alignment
vec2 Float
Begin Float
Begin

leftMiddle :: Alignment
leftMiddle :: Alignment
leftMiddle = Float -> Float -> Alignment
vec2 Float
Begin Float
Middle

leftBottom :: Alignment
leftBottom :: Alignment
leftBottom = Float -> Float -> Alignment
vec2 Float
Begin Float
End

centerTop :: Alignment
centerTop :: Alignment
centerTop = Float -> Float -> Alignment
vec2 Float
Middle Float
Begin

center :: Alignment
center :: Alignment
center = Float -> Float -> Alignment
vec2 Float
Middle Float
Middle

centerBottom :: Alignment
centerBottom :: Alignment
centerBottom = Float -> Float -> Alignment
vec2 Float
Middle Float
End

rightTop :: Alignment
rightTop :: Alignment
rightTop = Float -> Float -> Alignment
vec2 Float
End Float
Begin

rightMiddle :: Alignment
rightMiddle :: Alignment
rightMiddle = Float -> Float -> Alignment
vec2 Float
End Float
Middle

rightBottom :: Alignment
rightBottom :: Alignment
rightBottom = Float -> Float -> Alignment
vec2 Float
End Float
End

type Origin = Float

pattern Begin :: Origin
pattern $bBegin :: Float
$mBegin :: forall {r}. Float -> ((# #) -> r) -> ((# #) -> r) -> r
Begin = 0.0

pattern Middle :: Origin
pattern $bMiddle :: Float
$mMiddle :: forall {r}. Float -> ((# #) -> r) -> ((# #) -> r) -> r
Middle = 0.5

pattern End :: Origin
pattern $bEnd :: Float
$mEnd :: forall {r}. Float -> ((# #) -> r) -> ((# #) -> r) -> r
End = 1.0

{- | Distribute size difference according to origin.

@
(before, after) = placeSize1d _origin size target
before + size + after === target

placeBegin = placeSize1d 0
(0.0, 1.0) = placeBegin 1.0 2.0

placeMiddle = placeSize1d 0.5
(1.0, 1.0) = placeMiddle 1.0 3.0

placeEnd = placeSize1d 1.0
(1.0, 0.0) = placeEnd 1.0 2.0
@
-}
{-# INLINE placeSize1d #-}
placeSize1d :: Origin -> Float -> Float -> (Float, Float)
placeSize1d :: Float -> Float -> Float -> (Float, Float)
placeSize1d Float
origin Float
size Float
target = (Float
before, Float
after)
  where
    leftovers :: Float
leftovers = Float
target forall a. Num a => a -> a -> a
- Float
size
    before :: Float
before = Float
leftovers forall a. Num a => a -> a -> a
* Float
origin
    after :: Float
after = Float
leftovers forall a. Num a => a -> a -> a
- Float
before