packages feed

geomancy-layout-0.1.1: src/Geomancy/Layout/Alignment.hs

module Geomancy.Layout.Alignment where

import Geomancy

-- | @left/center/right@ & @top/middle/bottom@
newtype Alignment = Alignment Vec2
  deriving (Eq, Ord, Show)
  deriving newtype (Num)

leftTop :: Alignment
leftTop = Alignment $ vec2 Begin Begin

leftMiddle :: Alignment
leftMiddle = Alignment $ vec2 Begin Middle

leftBottom :: Alignment
leftBottom = Alignment $ vec2 Begin End

centerTop :: Alignment
centerTop = Alignment $ vec2 Middle Begin

center :: Alignment
center = Alignment $ vec2 Middle Middle

centerBottom :: Alignment
centerBottom = Alignment $ vec2 Middle End

rightTop :: Alignment
rightTop = Alignment $ vec2 End Begin

rightMiddle :: Alignment
rightMiddle = Alignment $ vec2 End Middle

rightBottom :: Alignment
rightBottom = Alignment $ vec2 End End

type Origin = Float

pattern Begin :: Origin
pattern Begin = 0.0

pattern Middle :: Origin
pattern Middle = 0.5

pattern End :: Origin
pattern 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 origin size target = (before, after)
  where
    leftovers = target - size
    before = leftovers * origin
    after = leftovers - before