summaryrefslogtreecommitdiff
path: root/src/Types.hs
blob: a90e5fe962b6de90d40c8a3e33d6e8ee72c42354 (plain)
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
{-# LANGUAGE TemplateHaskell, OverloadedStrings, ConstraintKinds, FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances, UndecidableInstances, MultiParamTypeClasses #-}

module Types
       ( Entity(..)
       , SequenceValue
       , Comment
       , Alteration(..)
       , Sequence
       , History
       , Context(..)
       , SequenceM
       ) where

import Data.PQueue.Prio.Max (MaxPQueue)
import qualified Data.PQueue.Prio.Max as MaxPQueue (empty)

import Data.Sequence (Seq)
import qualified Data.Sequence as Seq (empty)

import Data.Text (Text)

import Data.Default.Class

import Control.Monad.State.Strict (MonadState(..), MonadTrans(..))
import Control.Monad.Writer.Strict (MonadWriter, MonadTrans(..))

import Control.Monad.IO.Class (MonadIO)

import System.Console.Haskeline (InputT)

  
data Entity = Entity Text (Maybe Integer)
            deriving (Eq, Ord, Show)

type SequenceValue = Integer

type Comment = Text

data Alteration = Modify Entity SequenceValue
                | Override Entity SequenceValue
                | Drop Entity
                | Insert Entity SequenceValue
                | Rename Entity Entity
                deriving (Show)

type Sequence = MaxPQueue SequenceValue Entity

type History = Seq (Alteration, Comment)

data Context = Context
               { ctxSequence :: Sequence
               , ctxHistory  :: History
               }
             deriving (Show)

type SequenceM m = (MonadState Context m, MonadIO m)

instance MonadState s m => MonadState s (InputT m) where
  get = lift get
  put = lift . put
  state = lift . state

instance Default Context where
  def = Context
        { ctxSequence = MaxPQueue.empty
        , ctxHistory  = Seq.empty
        }