summaryrefslogtreecommitdiffstats
path: root/src/Phi/Panel.hs
blob: 23b022f873cae71bef321588b1027ac12abdb417 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
{-# LANGUAGE ExistentialQuantification #-}

module Phi.Panel ( Panel(..)
                 , PanelClass(..)
                 , (<~>)
                 , separator
                 ) where

import Data.Function

class PanelClass a where
  minSize :: a -> Int
  
  weight :: a -> Float
  weight _ = 0

data Panel = forall a. PanelClass a => Panel a

instance PanelClass Panel where
  minSize (Panel p) = minSize p
  weight (Panel p) = weight p

data CompoundPanel = CompoundPanel Panel Panel

instance PanelClass CompoundPanel where
  minSize (CompoundPanel a b) = ((+) `on` minSize) a b
  weight (CompoundPanel a b) = ((+) `on` weight) a b

(<~>) :: Panel -> Panel -> Panel
a <~> b = Panel $ CompoundPanel a b


data Separator = Separator Int Float

instance PanelClass Separator where
  minSize (Separator s _) = s
  weight (Separator _ w) = w

separator :: Int -> Float -> Panel
separator s w = Panel $ Separator s w