wumpus-tree-0.17.0: src/Wumpus/Tree/Base.hs
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE FlexibleContexts #-}
{-# OPTIONS -Wall #-}
--------------------------------------------------------------------------------
-- |
-- Module : Wumpus.Tree.Base
-- Copyright : (c) Stephen Tetley 2010-2011
-- License : BSD3
--
-- Maintainer : stephen.tetley@gmail.com
-- Stability : unstable
-- Portability : GHC
--
-- Common types, ...
--
--------------------------------------------------------------------------------
module Wumpus.Tree.Base
(
TreeMonad
, OTMAnchorConn
, TreeProps(..)
, TreeDirection(..)
, runTreeMonad
, drawConn
) where
import Wumpus.Basic.Kernel -- package: wumpus-basic
import Wumpus.Core -- package: wumpus-core
import Control.Applicative
import Data.Monoid
data TreeMonad node u a = TreeMonad {
getTreeMonad :: TreeProps node u -> LocDrawing u a }
type instance DUnit (TreeMonad node u a) = u
type OTMAnchorConn node u = TreeDirection -> u -> node -> [node] -> Graphic u
-- Design note - as the TreeMonad will be used internally there
-- doesn\'t seem to be a need for user state.
data TreeProps node u = TreeProps
{ tp_sibling_distance :: u
, tp_level_distance :: u
, tp_direction :: TreeDirection
, tp_otm_connector :: OTMAnchorConn node u
}
type instance DUnit (TreeProps node u) = u
data TreeDirection = TREE_UP | TREE_DOWN | TREE_LEFT | TREE_RIGHT
deriving (Eq,Ord,Show)
-- Note - not entirely sure TreeDrawing is a LocTrace, it will
-- certainly need branching if it is.
-- Functor
instance Functor (TreeMonad node u) where
fmap f ma = TreeMonad $ \env -> fmap f $ getTreeMonad ma env
-- Applicative
instance Applicative (TreeMonad node u) where
pure a = TreeMonad $ \_ -> pure a
mf <*> ma = TreeMonad $ \env ->
getTreeMonad mf env <*> getTreeMonad ma env
-- Monad
instance Monad (TreeMonad node u) where
return a = TreeMonad $ \_ -> return a
ma >>= k = TreeMonad $ \env ->
getTreeMonad ma env >>= \ans -> getTreeMonad (k ans) env
-- Monoid
instance Monoid a => Monoid (TreeMonad node u a) where
mempty = TreeMonad $ \_ -> mempty
ma `mappend` mb = TreeMonad $ \env ->
getTreeMonad ma env `mappend` getTreeMonad mb env
-- DrawingCtxM
instance DrawingCtxM (TreeMonad node u) where
askDC = TreeMonad $ \_ -> askDC
asksDC fn = TreeMonad $ \_ -> asksDC fn
localize upd ma = TreeMonad $ \env -> localize upd (getTreeMonad ma env)
instance InterpretUnit u => LocDrawM (TreeMonad node u) where
inserti gf = TreeMonad $ \_ -> inserti gf
insertli p1 gf = TreeMonad $ \_ -> insertli p1 gf
insertci p1 p2 gf = TreeMonad $ \_ -> insertci p1 p2 gf
runTreeMonad :: (Translate a, InterpretUnit u, u ~ DUnit a)
=> TreeMonad node u a -> TreeProps node u -> LocImage u a
runTreeMonad ma props = runLocDrawing $ getTreeMonad ma props
drawConn :: InterpretUnit u
=> node -> [node] -> TreeMonad node u ()
drawConn start kids = TreeMonad $ \(TreeProps { tp_level_distance = h
, tp_otm_connector = conn
, tp_direction = tdir
}) ->
let gf = conn tdir h start kids in inserti_ gf