{-# LANGUAGE RecordWildCards, OverloadedStrings, DeriveGeneric #-}
module Graphics.Layout.Grid(Grid(..), Track(..), GridItem(..), GridItem'(..), Alignment(..),
buildTrack, buildGrid, setCellBox, enumerate, gridItemBox, cellSize,
trackMin, trackNat, gridEstWidth, sizeTrackMins, sizeTrackNats, sizeTrackMaxs,
trackPosition, gridPosition, trackLayout, gridLayout) where
import Data.Either (fromRight)
import Data.Text (Text)
import Data.List (intersperse)
import Graphics.Layout.Box as B
import Debug.Trace (trace)
import GHC.Generics (Generic)
import Control.DeepSeq (NFData)
type Grid m n = Size (Track m) (Track n)
data Track x = Track {
forall x. Track x -> [Either x Double]
cells :: [Either x Double],
forall x. Track x -> [Double]
trackMins :: [Double],
forall x. Track x -> [Double]
trackNats :: [Double],
forall x. Track x -> x
gap :: x
}
type GridItem = Size GridItem' GridItem'
data GridItem' = GridItem {
GridItem' -> Int
cellStart :: Int,
GridItem' -> Int
cellEnd :: Int,
GridItem' -> Alignment
alignment :: Alignment,
GridItem' -> Double
minSize :: Double,
GridItem' -> Double
natSize :: Double
} deriving (ReadPrec [GridItem']
ReadPrec GridItem'
Int -> ReadS GridItem'
ReadS [GridItem']
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [GridItem']
$creadListPrec :: ReadPrec [GridItem']
readPrec :: ReadPrec GridItem'
$creadPrec :: ReadPrec GridItem'
readList :: ReadS [GridItem']
$creadList :: ReadS [GridItem']
readsPrec :: Int -> ReadS GridItem'
$creadsPrec :: Int -> ReadS GridItem'
Read, Int -> GridItem' -> ShowS
[GridItem'] -> ShowS
GridItem' -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [GridItem'] -> ShowS
$cshowList :: [GridItem'] -> ShowS
show :: GridItem' -> String
$cshow :: GridItem' -> String
showsPrec :: Int -> GridItem' -> ShowS
$cshowsPrec :: Int -> GridItem' -> ShowS
Show, Eq GridItem'
GridItem' -> GridItem' -> Bool
GridItem' -> GridItem' -> Ordering
GridItem' -> GridItem' -> GridItem'
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 :: GridItem' -> GridItem' -> GridItem'
$cmin :: GridItem' -> GridItem' -> GridItem'
max :: GridItem' -> GridItem' -> GridItem'
$cmax :: GridItem' -> GridItem' -> GridItem'
>= :: GridItem' -> GridItem' -> Bool
$c>= :: GridItem' -> GridItem' -> Bool
> :: GridItem' -> GridItem' -> Bool
$c> :: GridItem' -> GridItem' -> Bool
<= :: GridItem' -> GridItem' -> Bool
$c<= :: GridItem' -> GridItem' -> Bool
< :: GridItem' -> GridItem' -> Bool
$c< :: GridItem' -> GridItem' -> Bool
compare :: GridItem' -> GridItem' -> Ordering
$ccompare :: GridItem' -> GridItem' -> Ordering
Ord, GridItem' -> GridItem' -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: GridItem' -> GridItem' -> Bool
$c/= :: GridItem' -> GridItem' -> Bool
== :: GridItem' -> GridItem' -> Bool
$c== :: GridItem' -> GridItem' -> Bool
Eq, forall x. Rep GridItem' x -> GridItem'
forall x. GridItem' -> Rep GridItem' x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep GridItem' x -> GridItem'
$cfrom :: forall x. GridItem' -> Rep GridItem' x
Generic)
instance NFData GridItem'
data Alignment = Start | Mid | End deriving (ReadPrec [Alignment]
ReadPrec Alignment
Int -> ReadS Alignment
ReadS [Alignment]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [Alignment]
$creadListPrec :: ReadPrec [Alignment]
readPrec :: ReadPrec Alignment
$creadPrec :: ReadPrec Alignment
readList :: ReadS [Alignment]
$creadList :: ReadS [Alignment]
readsPrec :: Int -> ReadS Alignment
$creadsPrec :: Int -> ReadS Alignment
Read, Int -> Alignment -> ShowS
[Alignment] -> ShowS
Alignment -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Alignment] -> ShowS
$cshowList :: [Alignment] -> ShowS
show :: Alignment -> String
$cshow :: Alignment -> String
showsPrec :: Int -> Alignment -> ShowS
$cshowsPrec :: Int -> Alignment -> ShowS
Show, Int -> Alignment
Alignment -> Int
Alignment -> [Alignment]
Alignment -> Alignment
Alignment -> Alignment -> [Alignment]
Alignment -> Alignment -> Alignment -> [Alignment]
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: Alignment -> Alignment -> Alignment -> [Alignment]
$cenumFromThenTo :: Alignment -> Alignment -> Alignment -> [Alignment]
enumFromTo :: Alignment -> Alignment -> [Alignment]
$cenumFromTo :: Alignment -> Alignment -> [Alignment]
enumFromThen :: Alignment -> Alignment -> [Alignment]
$cenumFromThen :: Alignment -> Alignment -> [Alignment]
enumFrom :: Alignment -> [Alignment]
$cenumFrom :: Alignment -> [Alignment]
fromEnum :: Alignment -> Int
$cfromEnum :: Alignment -> Int
toEnum :: Int -> Alignment
$ctoEnum :: Int -> Alignment
pred :: Alignment -> Alignment
$cpred :: Alignment -> Alignment
succ :: Alignment -> Alignment
$csucc :: Alignment -> Alignment
Enum, Eq Alignment
Alignment -> Alignment -> Bool
Alignment -> Alignment -> Ordering
Alignment -> Alignment -> Alignment
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 :: Alignment -> Alignment -> Alignment
$cmin :: Alignment -> Alignment -> Alignment
max :: Alignment -> Alignment -> Alignment
$cmax :: Alignment -> Alignment -> Alignment
>= :: Alignment -> Alignment -> Bool
$c>= :: Alignment -> Alignment -> Bool
> :: Alignment -> Alignment -> Bool
$c> :: Alignment -> Alignment -> Bool
<= :: Alignment -> Alignment -> Bool
$c<= :: Alignment -> Alignment -> Bool
< :: Alignment -> Alignment -> Bool
$c< :: Alignment -> Alignment -> Bool
compare :: Alignment -> Alignment -> Ordering
$ccompare :: Alignment -> Alignment -> Ordering
Ord, Alignment -> Alignment -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Alignment -> Alignment -> Bool
$c/= :: Alignment -> Alignment -> Bool
== :: Alignment -> Alignment -> Bool
$c== :: Alignment -> Alignment -> Bool
Eq, forall x. Rep Alignment x -> Alignment
forall x. Alignment -> Rep Alignment x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Alignment x -> Alignment
$cfrom :: forall x. Alignment -> Rep Alignment x
Generic)
instance NFData Alignment
buildTrack :: CastDouble x => [Either x Double] -> Track x
buildTrack :: forall x. CastDouble x => [Either x Double] -> Track x
buildTrack [Either x Double]
cells = forall x. [Either x Double] -> [Double] -> [Double] -> x -> Track x
Track [Either x Double]
cells [] [] forall a b. (a -> b) -> a -> b
$ forall a. CastDouble a => Double -> a
fromDouble Double
0
buildGrid :: (CastDouble m, CastDouble n) =>
[Either m Double] -> [Either n Double] -> Grid m n
buildGrid :: forall m n.
(CastDouble m, CastDouble n) =>
[Either m Double] -> [Either n Double] -> Grid m n
buildGrid [Either m Double]
rows [Either n Double]
cols = forall m n. n -> m -> Size m n
Size (forall x. CastDouble x => [Either x Double] -> Track x
buildTrack [Either n Double]
cols) (forall x. CastDouble x => [Either x Double] -> Track x
buildTrack [Either m Double]
rows)
verifyTrack :: Track x -> [GridItem'] -> Bool
verifyTrack :: forall x. Track x -> [GridItem'] -> Bool
verifyTrack Track x
track [GridItem']
cells' = forall (t :: * -> *). Foldable t => t Bool -> Bool
and [
GridItem' -> Int
cellStart GridItem'
cell forall a. Ord a => a -> a -> Bool
< forall (t :: * -> *) a. Foldable t => t a -> Int
length (forall x. Track x -> [Either x Double]
cells Track x
track) Bool -> Bool -> Bool
&& GridItem' -> Int
cellStart GridItem'
cell forall a. Ord a => a -> a -> Bool
>= Int
0 Bool -> Bool -> Bool
&&
GridItem' -> Int
cellEnd GridItem'
cell forall a. Ord a => a -> a -> Bool
< forall (t :: * -> *) a. Foldable t => t a -> Int
length (forall x. Track x -> [Either x Double]
cells Track x
track) Bool -> Bool -> Bool
&& GridItem' -> Int
cellEnd GridItem'
cell forall a. Ord a => a -> a -> Bool
> GridItem' -> Int
cellStart GridItem'
cell
| GridItem'
cell <- [GridItem']
cells']
verifyGrid :: Grid m n -> [GridItem] -> Bool
verifyGrid :: forall m n. Grid m n -> [GridItem] -> Bool
verifyGrid Grid m n
grid [GridItem]
cells =
forall x. Track x -> [GridItem'] -> Bool
verifyTrack (forall m n. Size m n -> n
inline Grid m n
grid) (forall a b. (a -> b) -> [a] -> [b]
map forall m n. Size m n -> n
inline [GridItem]
cells) Bool -> Bool -> Bool
&& forall x. Track x -> [GridItem'] -> Bool
verifyTrack (forall m n. Size m n -> m
block Grid m n
grid) (forall a b. (a -> b) -> [a] -> [b]
map forall m n. Size m n -> m
block [GridItem]
cells)
trackMin :: (n -> Double) -> Track n -> Double
trackMin :: forall n. (n -> Double) -> Track n -> Double
trackMin n -> Double
cb self :: Track n
self@Track { trackMins :: forall x. Track x -> [Double]
trackMins = [] } =
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum forall a b. (a -> b) -> a -> b
$ forall a. a -> [a] -> [a]
intersperse (n -> Double
cb forall a b. (a -> b) -> a -> b
$ forall x. Track x -> x
gap Track n
self) [n -> Double
cb n
x | Left n
x <- forall x. Track x -> [Either x Double]
cells Track n
self]
trackMin n -> Double
cb Track n
self = forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum forall a b. (a -> b) -> a -> b
$ forall a. a -> [a] -> [a]
intersperse (n -> Double
cb forall a b. (a -> b) -> a -> b
$ forall x. Track x -> x
gap Track n
self) forall a b. (a -> b) -> a -> b
$ forall x. Track x -> [Double]
trackMins Track n
self
trackNat :: (n -> Double) -> Track n -> Double
trackNat :: forall n. (n -> Double) -> Track n -> Double
trackNat n -> Double
cb self :: Track n
self@Track { trackNats :: forall x. Track x -> [Double]
trackNats = [] } =
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum forall a b. (a -> b) -> a -> b
$ forall a. a -> [a] -> [a]
intersperse (n -> Double
cb forall a b. (a -> b) -> a -> b
$ forall x. Track x -> x
gap Track n
self) [n -> Double
cb n
x | Left n
x <- forall x. Track x -> [Either x Double]
cells Track n
self]
trackNat n -> Double
cb Track n
self = forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum forall a b. (a -> b) -> a -> b
$ forall a. a -> [a] -> [a]
intersperse (n -> Double
cb forall a b. (a -> b) -> a -> b
$ forall x. Track x -> x
gap Track n
self) forall a b. (a -> b) -> a -> b
$ forall x. Track x -> [Double]
trackNats Track n
self
cellsForIndex :: [GridItem'] -> Int -> [GridItem']
cellsForIndex :: [GridItem'] -> Int -> [GridItem']
cellsForIndex [GridItem']
cells Int
ix =
[GridItem'
cell | GridItem'
cell <- [GridItem']
cells, GridItem' -> Int
cellStart GridItem'
cell forall a. Eq a => a -> a -> Bool
== Int
ix, GridItem' -> Int
cellStart GridItem'
cell forall a. Eq a => a -> a -> Bool
== forall a. Enum a => a -> a
pred (GridItem' -> Int
cellEnd GridItem'
cell)]
setCellBox :: (CastDouble m, CastDouble n) => GridItem -> PaddedBox m n -> GridItem
setCellBox :: forall m n.
(CastDouble m, CastDouble n) =>
GridItem -> PaddedBox m n -> GridItem
setCellBox (Size GridItem'
x GridItem'
y) PaddedBox m n
box = forall m n. n -> m -> Size m n
Size GridItem'
x {
minSize :: Double
minSize = forall {a} {m}. Num a => PaddedBox m a -> a
B.minWidth forall a b. (a -> b) -> a -> b
$ forall n nn m. (n -> nn) -> PaddedBox m n -> PaddedBox m nn
mapX' forall a. CastDouble a => a -> Double
toDouble PaddedBox m n
box,
natSize :: Double
natSize = forall {a} {m}. Num a => PaddedBox m a -> a
B.width forall a b. (a -> b) -> a -> b
$ forall n nn m. (n -> nn) -> PaddedBox m n -> PaddedBox m nn
mapX' forall a. CastDouble a => a -> Double
toDouble PaddedBox m n
box
} GridItem'
y {
minSize :: Double
minSize = forall {a} {n}. Num a => PaddedBox a n -> a
B.minHeight forall a b. (a -> b) -> a -> b
$ forall m mm n. (m -> mm) -> PaddedBox m n -> PaddedBox mm n
mapY' forall a. CastDouble a => a -> Double
toDouble PaddedBox m n
box,
natSize :: Double
natSize = forall {a} {n}. Num a => PaddedBox a n -> a
B.height forall a b. (a -> b) -> a -> b
$ forall m mm n. (m -> mm) -> PaddedBox m n -> PaddedBox mm n
mapY' forall a. CastDouble a => a -> Double
toDouble PaddedBox m n
box
}
gridEstWidth :: Grid y Length -> [GridItem] -> Double
gridEstWidth :: forall y. Grid y Length -> [GridItem] -> Double
gridEstWidth (Size Track Length
cols Track y
_) [GridItem]
childs = forall n. (n -> Double) -> Track n -> Double
trackNat forall a. CastDouble a => a -> Double
toDouble Track Length
cols {
trackMins :: [Double]
trackMins = Double -> Track Length -> [GridItem'] -> [Double]
sizeTrackMins Double
0 Track Length
cols forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map forall m n. Size m n -> n
inline [GridItem]
childs,
trackNats :: [Double]
trackNats = Double -> Track Length -> [GridItem'] -> [Double]
sizeTrackNats Double
0 Track Length
cols forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map forall m n. Size m n -> n
inline [GridItem]
childs
}
sizeTrackMins :: Double -> Track Length -> [GridItem'] -> [Double]
sizeTrackMins :: Double -> Track Length -> [GridItem'] -> [Double]
sizeTrackMins Double
parent Track Length
track [GridItem']
childs = forall a b. (a -> b) -> [a] -> [b]
map forall {b}. (Int, Either Length b) -> Double
inner forall a b. (a -> b) -> a -> b
$ forall {b}. [b] -> [(Int, b)]
enumerate forall a b. (a -> b) -> a -> b
$ forall x. Track x -> [Either x Double]
cells Track Length
track
where
inner :: (Int, Either Length b) -> Double
inner (Int
_, Left (Pixels Double
x)) = Double
x
inner (Int
_, Left (Percent Double
x)) = Double
x forall a. Num a => a -> a -> a
* Double
parent
inner arg :: (Int, Either Length b)
arg@(Int
ix, Left Length
Preferred) =
forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
maximum forall a b. (a -> b) -> a -> b
$ (Double
0forall a. a -> [a] -> [a]
:) forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map GridItem' -> Double
natSize forall a b. (a -> b) -> a -> b
$ [GridItem'] -> Int -> [GridItem']
cellsForIndex [GridItem']
childs Int
ix
inner (Int
ix, Either Length b
_) =
forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
maximum forall a b. (a -> b) -> a -> b
$ (Double
0forall a. a -> [a] -> [a]
:) forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map GridItem' -> Double
minSize forall a b. (a -> b) -> a -> b
$ [GridItem'] -> Int -> [GridItem']
cellsForIndex [GridItem']
childs Int
ix
sizeTrackNats :: Double -> Track Length -> [GridItem'] -> [Double]
sizeTrackNats :: Double -> Track Length -> [GridItem'] -> [Double]
sizeTrackNats Double
parent Track Length
track [GridItem']
childs = forall a b. (a -> b) -> [a] -> [b]
map forall {b}. (Int, Either Length b) -> Double
inner forall a b. (a -> b) -> a -> b
$ forall {b}. [b] -> [(Int, b)]
enumerate forall a b. (a -> b) -> a -> b
$ forall x. Track x -> [Either x Double]
cells Track Length
track
where
inner :: (Int, Either Length b) -> Double
inner (Int
_, Left (Pixels Double
x)) = Double
x
inner (Int
_, Left (Percent Double
x)) = Double
x forall a. Num a => a -> a -> a
* Double
parent
inner arg :: (Int, Either Length b)
arg@(Int
ix, Left Length
Min) =
forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
maximum forall a b. (a -> b) -> a -> b
$ (Double
0forall a. a -> [a] -> [a]
:) forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map GridItem' -> Double
minSize forall a b. (a -> b) -> a -> b
$ [GridItem'] -> Int -> [GridItem']
cellsForIndex [GridItem']
childs Int
ix
inner (Int
ix, Either Length b
_) =
forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
maximum forall a b. (a -> b) -> a -> b
$ (Double
0forall a. a -> [a] -> [a]
:) forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map GridItem' -> Double
natSize forall a b. (a -> b) -> a -> b
$ [GridItem'] -> Int -> [GridItem']
cellsForIndex [GridItem']
childs Int
ix
sizeTrackMaxs :: Double -> Track Length -> [Double]
sizeTrackMaxs :: Double -> Track Length -> [Double]
sizeTrackMaxs Double
parent Track Length
track = forall a b. (a -> b) -> [a] -> [b]
map (Double -> ((Double, Double), Either Length Double) -> Double
inner Double
fr) forall a b. (a -> b) -> a -> b
$ forall a b. [a] -> [b] -> [(a, b)]
zip [(Double, Double)]
subsizes forall a b. (a -> b) -> a -> b
$ forall x. Track x -> [Either x Double]
cells Track Length
track
where
subsizes :: [(Double, Double)]
subsizes = forall a b. [a] -> [b] -> [(a, b)]
zip (forall x. Track x -> [Double]
trackMins Track Length
track) (forall x. Track x -> [Double]
trackNats Track Length
track)
fr :: Double
fr = forall a. Ord a => a -> a -> a
Prelude.max Double
0 Double
fr'
fr' :: Double
fr' = (Double
parent forall a. Num a => a -> a -> a
- Double
estimate)forall a. Fractional a => a -> a -> a
/(forall {a}. (Enum a, Num a) => [Either Length a] -> a
countFRs forall a b. (a -> b) -> a -> b
$ forall x. Track x -> [Either x Double]
cells Track Length
track)
estimate :: Double
estimate = forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum forall a b. (a -> b) -> a -> b
$ forall a. a -> [a] -> [a]
intersperse (Double -> Length -> Double
lowerLength Double
parent forall a b. (a -> b) -> a -> b
$ forall x. Track x -> x
gap Track Length
track) forall a b. (a -> b) -> a -> b
$
forall a b. (a -> b) -> [a] -> [b]
map (Double -> ((Double, Double), Either Length Double) -> Double
inner Double
0) forall a b. (a -> b) -> a -> b
$ forall a b. [a] -> [b] -> [(a, b)]
zip [(Double, Double)]
subsizes forall a b. (a -> b) -> a -> b
$ forall x. Track x -> [Either x Double]
cells Track Length
track
inner :: Double -> ((Double, Double), Either Length Double) -> Double
inner Double
_ ((Double, Double)
_, Left (Pixels Double
x)) = Double
x
inner Double
_ ((Double, Double)
_, Left (Percent Double
x)) = Double
xforall a. Num a => a -> a -> a
*Double
parent
inner Double
_ ((Double
_, Double
nat), Left Length
Preferred) = Double
nat
inner Double
_ ((Double
min, Double
_), Left Length
Min) = Double
min
inner Double
fr ((Double
_, Double
nat), Left Length
Auto) = forall a. Ord a => a -> a -> a
Prelude.min Double
nat Double
fr
inner Double
fr ((Double, Double)
_, Right Double
x) = Double
xforall a. Num a => a -> a -> a
*Double
fr
trackPosition :: Track Double -> [GridItem'] -> [Double]
trackPosition :: Track Double -> [GridItem'] -> [Double]
trackPosition Track Double
self [GridItem']
childs = forall a b. (a -> b) -> [a] -> [b]
map GridItem' -> Double
gridCellPosition [GridItem']
childs
where
gridCellPosition :: GridItem' -> Double
gridCellPosition GridItem'
child = Int -> Double
track (GridItem' -> Int
cellStart GridItem'
child) forall a. Num a => a -> a -> a
+ forall {a}. Fractional a => a -> Alignment -> a
align Double
whitespace (GridItem' -> Alignment
alignment GridItem'
child)
where
whitespace :: Double
whitespace = Int -> Double
track (GridItem' -> Int
cellEnd GridItem'
child) forall a. Num a => a -> a -> a
- Int -> Double
track (GridItem' -> Int
cellStart GridItem'
child) forall a. Num a => a -> a -> a
- GridItem' -> Double
natSize GridItem'
child
track :: Int -> Double
track = forall a b c. (a -> b -> c) -> b -> a -> c
flip forall {t} {a} {a}.
(Enum t, Eq t, Num a, Num t) =>
t -> [Either a a] -> a
track' forall a b. (a -> b) -> a -> b
$ forall x. Track x -> [Either x Double]
cells Track Double
self
track' :: t -> [Either a a] -> a
track' t
ix (Either a a
size:[Either a a]
sizes) = forall b a. b -> Either a b -> b
fromRight a
0 Either a a
size forall a. Num a => a -> a -> a
+ t -> [Either a a] -> a
track' (forall a. Enum a => a -> a
pred t
ix) [Either a a]
sizes
track' t
0 [Either a a]
_ = a
0
track' t
ix [] = forall a. String -> a -> a
trace String
"WARNING! Malformed input table!" a
0
align :: a -> Alignment -> a
align a
_ Alignment
Start = a
0
align a
excess Alignment
Mid = a
excessforall a. Fractional a => a -> a -> a
/a
2
align a
excess Alignment
End = a
excess
cellSize :: CastDouble x => Track x -> GridItem' -> Double
cellSize :: forall x. CastDouble x => Track x -> GridItem' -> Double
cellSize Track x
self GridItem'
child = Int -> Double
track (GridItem' -> Int
cellEnd GridItem'
child) forall a. Num a => a -> a -> a
- Int -> Double
track (GridItem' -> Int
cellStart GridItem'
child)
where
track :: Int -> Double
track = forall a b c. (a -> b -> c) -> b -> a -> c
flip forall {a} {t} {a}.
(CastDouble a, Enum t, Eq t, Num t) =>
t -> [Either a a] -> Double
track' forall a b. (a -> b) -> a -> b
$ forall x. Track x -> [Either x Double]
cells Track x
self
track' :: t -> [Either a a] -> Double
track' t
ix (Either a a
size:[Either a a]
sizes) =
(forall a. CastDouble a => a -> Double
toDouble forall a b. (a -> b) -> a -> b
$ forall b a. b -> Either a b -> b
fromRight (forall a. CastDouble a => Double -> a
fromDouble Double
0) Either a a
size) forall a. Num a => a -> a -> a
+ t -> [Either a a] -> Double
track' (forall a. Enum a => a -> a
pred t
ix) [Either a a]
sizes
track' t
0 [Either a a]
_ = Double
0
track' t
ix [] = forall a. String -> a -> a
trace String
"WARNING! Malformed input table!" Double
0
gridItemBox :: (CastDouble x, CastDouble y) => Grid y x -> GridItem -> PaddedBox Double Double
gridItemBox :: forall x y.
(CastDouble x, CastDouble y) =>
Grid y x -> GridItem -> PaddedBox Double Double
gridItemBox (Size Track x
cols Track y
rows) GridItem
cell =
forall {m} {n}. (Zero m, Zero n) => Size m n -> PaddedBox m n
size2box (forall x. CastDouble x => Track x -> GridItem' -> Double
cellSize Track x
cols (forall m n. Size m n -> n
inline GridItem
cell) forall m n. n -> m -> Size m n
`Size` forall x. CastDouble x => Track x -> GridItem' -> Double
cellSize Track y
rows (forall m n. Size m n -> m
block GridItem
cell))
where
size2box :: Size m n -> PaddedBox m n
size2box Size m n
size = forall a. Zero a => a
zero { min :: Size m n
B.min = Size m n
size, max :: Size m n
B.max = Size m n
size, size :: Size m n
B.size = Size m n
size }
gridPosition :: Grid Double Double -> [GridItem] -> [(Double, Double)]
gridPosition :: Grid Double Double -> [GridItem] -> [(Double, Double)]
gridPosition (Size Track Double
cols Track Double
rows) [GridItem]
childs =
Track Double -> [GridItem'] -> [Double]
trackPosition Track Double
rows (forall a b. (a -> b) -> [a] -> [b]
map forall m n. Size m n -> n
inline [GridItem]
childs) forall a b. [a] -> [b] -> [(a, b)]
`zip` Track Double -> [GridItem'] -> [Double]
trackPosition Track Double
cols (forall a b. (a -> b) -> [a] -> [b]
map forall m n. Size m n -> m
block [GridItem]
childs)
trackLayout :: Double -> Double -> Track Length -> [GridItem'] ->
(Track Double, [(Double, GridItem')])
trackLayout :: Double
-> Double
-> Track Length
-> [GridItem']
-> (Track Double, [(Double, GridItem')])
trackLayout Double
parent Double
width Track Length
self [GridItem']
childs = (Track Double
self', forall a b. [a] -> [b] -> [(a, b)]
zip [Double]
positions [GridItem']
childs)
where
positions :: [Double]
positions = Track Double -> [GridItem'] -> [Double]
trackPosition Track Double
self' [GridItem']
childs
self' :: Track Double
self' = Track Length
self {
cells :: [Either Double Double]
cells = forall a b. (a -> b) -> [a] -> [b]
map forall a b. a -> Either a b
Left [Double]
sizes,
trackMins :: [Double]
trackMins = [Double]
mins, trackNats :: [Double]
trackNats = [Double]
nats,
gap :: Double
gap = Double -> Length -> Double
lowerLength Double
width forall a b. (a -> b) -> a -> b
$ forall x. Track x -> x
gap Track Length
self
}
sizes :: [Double]
sizes = Double -> Track Length -> [Double]
sizeTrackMaxs Double
parent Track Length
self { trackMins :: [Double]
trackMins = [Double]
mins, trackNats :: [Double]
trackNats = [Double]
nats }
mins :: [Double]
mins = Double -> Track Length -> [GridItem'] -> [Double]
sizeTrackMins Double
parent Track Length
self [GridItem']
childs
nats :: [Double]
nats = Double -> Track Length -> [GridItem'] -> [Double]
sizeTrackNats Double
parent Track Length
self [GridItem']
childs
gridLayout :: Size Double Double -> Grid Length Length -> [GridItem] ->
(Grid Double Double, [((Double, Double), GridItem)])
gridLayout :: Size Double Double
-> Grid Length Length
-> [GridItem]
-> (Grid Double Double, [((Double, Double), GridItem)])
gridLayout Size Double Double
parent (Size Track Length
cols Track Length
rows) [GridItem]
childs = (Grid Double Double
self', forall a b. [a] -> [b] -> [(a, b)]
zip [(Double, Double)]
positions [GridItem]
childs)
where
positions :: [(Double, Double)]
positions = Grid Double Double -> [GridItem] -> [(Double, Double)]
gridPosition Grid Double Double
self' [GridItem]
childs
self' :: Grid Double Double
self' = forall m n. n -> m -> Size m n
Size Track Double
cols' { gap :: Double
gap = Double -> Length -> Double
lowerLength Double
width forall a b. (a -> b) -> a -> b
$ forall x. Track x -> x
gap Track Length
cols } Track Double
rows'
(Track Double
rows', [(Double, GridItem')]
_) = Double
-> Double
-> Track Length
-> [GridItem']
-> (Track Double, [(Double, GridItem')])
trackLayout (forall m n. Size m n -> m
block Size Double Double
parent) Double
width Track Length
rows forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map forall m n. Size m n -> m
block [GridItem]
childs
width :: Double
width = forall n. (n -> Double) -> Track n -> Double
trackNat forall a. a -> a
id Track Double
cols'
(Track Double
cols', [(Double, GridItem')]
_) = Double
-> Double
-> Track Length
-> [GridItem']
-> (Track Double, [(Double, GridItem')])
trackLayout (forall m n. Size m n -> n
inline Size Double Double
parent) Double
0 Track Length
cols forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map forall m n. Size m n -> n
inline [GridItem]
childs
enumerate :: [b] -> [(Int, b)]
enumerate = forall a b. [a] -> [b] -> [(a, b)]
zip [Int
0..]
countFRs :: [Either Length a] -> a
countFRs (Left Length
Auto:[Either Length a]
rest) = forall a. Enum a => a -> a
succ forall a b. (a -> b) -> a -> b
$ [Either Length a] -> a
countFRs [Either Length a]
rest
countFRs (Right a
x:[Either Length a]
rest) = a
x forall a. Num a => a -> a -> a
+ [Either Length a] -> a
countFRs [Either Length a]
rest
countFRs (Either Length a
_:[Either Length a]
rest) = [Either Length a] -> a
countFRs [Either Length a]
rest
countFRs [] = a
0