aboutsummaryrefslogtreecommitdiff
path: root/src/Wetterhorn/Layout/Combine.hs
blob: 983ceb19527d3e3263b900fae351830239069b09 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
{-# LANGUAGE ViewPatterns #-}

module Wetterhorn.Layout.Combine where

import Data.Typeable
import Wetterhorn.Constraints
import Wetterhorn.Core.W

data (|||) a b = Comb LR a b
  deriving (Typeable, Read, Show)

data Next = Next
  deriving (Typeable)

data Reset = Reset
  deriving (Typeable)

(|||) :: a -> b -> (a ||| b)
a ||| b = Comb L a b

data LR = L | R deriving (Read, Show, Ord, Eq, Enum)

instance (LayoutClass a, LayoutClass b) => LayoutClass (a ||| b) where
  type C (a ||| b) = C a &&&& C b

  runLayout as (Comb R r l) = do
    (r', ret) <- runLayout as r
    return (Comb R r' l, ret)
  runLayout as (Comb L r l) = do
    (l', ret) <- runLayout as l
    return (Comb R r l', ret)

  handleMessage (fromMessage -> Just Next) (Comb L l r) = return (Comb R l r)
  handleMessage (fromMessage -> Just Reset) (Comb _ l r) = return (Comb L l r)
  handleMessage mesg (Comb L l r) =
    Comb L <$> handleMessage mesg l <*> pure r
  handleMessage mesg (Comb R l r) =
    Comb L l <$> handleMessage mesg r

  serializeLayout (Comb lr l r) = show (Comb lr (serializeLayout l) (serializeLayout r))
  readLayout str = Comb lr <$> l <*> r
    where
      (Comb lr (readLayout -> l) (readLayout -> r)) = read str

  description (Comb _ l r) = description l ++ " ||| " ++ description r