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
|
{-# LANGUAGE TemplateHaskell, OverloadedStrings, ConstraintKinds, FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances, UndecidableInstances, MultiParamTypeClasses #-}
module Types
( Entity(..)
, SequenceValue
, Comment
, Alteration(..)
, Sequence
, History
, SequenceM
) where
import Data.PQueue.Prio.Max (MaxPQueue)
import qualified Data.PQueue.Prio.Max as MaxPQueue (empty)
import Data.Sequence (Seq)
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)
type SequenceM m = (MonadWriter History m, MonadState Sequence m, MonadIO m)
instance MonadState s m => MonadState s (InputT m) where
get = lift get
put = lift . put
state = lift . state
instance Default (MaxPQueue k v) where
def = MaxPQueue.empty
|