lgtk-0.1: src/GUI/MLens/Gtk/Demos/TEditor.hs
--{-# LANGUAGE ExistentialQuantification #-}
--{-# LANGUAGE MultiParamTypeClasses #-}
--{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE DataKinds #-}
module GUI.MLens.Gtk.Demos.TEditor where
import Control.Monad
import Prelude hiding ((.), id)
import GUI.MLens.Gtk
import GUI.MLens.Gtk.ADTEditor
-- | Binary tree shapes
data T
= Leaf
| Node T T
deriving Show
-- | Lens for @T@
tLens :: Monad m => MLens m (Bool, (T, T)) T
tLens = lens get set where
get (False, _) = Leaf
get (True, (l, r)) = Node l r
set Leaf (_, x) = (False, x)
set (Node l r) _ = (True, (l, r))
-- | @ADTLens@ instance for @T@
instance ADTLens T where
type ADTEls T = Cons T (Cons T Nil)
adtLens = ([("Leaf",[]),("Node",[0,1])], ElemsCons Leaf (ElemsCons Leaf ElemsNil), lens get set) where
get :: (Int, Elems (ADTEls T)) -> T
get (0, _) = Leaf
get (1, ElemsCons l (ElemsCons r ElemsNil)) = Node l r
set :: T -> (Int, Elems (ADTEls T)) -> (Int, Elems (ADTEls T))
set Leaf (_, x) = (0, x)
set (Node l r) _ = (1, ElemsCons l (ElemsCons r ElemsNil))
-- | @T@ editor with comboboxes, as an ADTEditor
tEditor1 :: (Functor m, ExtRef m) => I m
tEditor1 = Action $ newRef Leaf >>= adtEditor
-- | @T@ editor with checkboxes, given directly
tEditor2 :: ExtRef m => I m
tEditor2 = Action $ liftM editor $ newRef Leaf where
editor r = Action $ do
q <- extRef r tLens (False, (Leaf, Leaf))
return $ hcat
[ Checkbox $ fstLens . q
, Cell True (liftM fst (readRef q)) $ \b -> vcat $
[ editor $ fstLens . sndLens . q | b ]
++ [ editor $ sndLens . sndLens . q | b ]
]
-- | Another @T@ editor with checkboxes, given directly
tEditor3 :: ExtRef m => Ref m T -> m (I m)
tEditor3 = liftM Action . memoRead . editor' where
editor' r = do
q <- extRef r tLens (False, (Leaf, Leaf))
t1 <- tEditor3 $ fstLens . sndLens . q
t2 <- tEditor3 $ sndLens . sndLens . q
return $ hcat
[ Checkbox $ fstLens . q
, Cell True (liftM fst $ readRef q) $ \b -> vcat $ [t1 | b] ++ [t2 | b]
]