summaryrefslogtreecommitdiffstats
path: root/src/Phi/Panel.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Phi/Panel.hs')
-rw-r--r--src/Phi/Panel.hs40
1 files changed, 40 insertions, 0 deletions
diff --git a/src/Phi/Panel.hs b/src/Phi/Panel.hs
new file mode 100644
index 0000000..23b022f
--- /dev/null
+++ b/src/Phi/Panel.hs
@@ -0,0 +1,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