summaryrefslogtreecommitdiff
path: root/src/Types.hs
blob: 031d2d5d33cda645a5ca47161b8df49eb025acad (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
69
70
{-# 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 Data.CaseInsensitive (CI)

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 (CI 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
        }