{-# LANGUAGE ExistentialQuantification #-} module Phi.Panel ( Position(..) , Panel(..) , PanelClass(..) , (<~>) , separator ) where import Data.Function data Position = Top | Bottom 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