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