summaryrefslogtreecommitdiff
path: root/src/Types.hs
blob: 10cea7af7d69c864b9ff0020f9b3483bd16aa1e6 (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
{-# 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