41 lines
916 B
Haskell
41 lines
916 B
Haskell
|
{-# 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
|