summaryrefslogtreecommitdiff
path: root/src/Erebos/Conversation/Class.hs
blob: 7c3652dd0726450f84d2e68cfb654a66b9ddc9dc (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
module Erebos.Conversation.Class (
    ConversationType(..),
    MessageExtra(..),
    RefDigest,
) where

import Control.Monad.Except

import Data.Text (Text)
import Data.Time.LocalTime
import Data.Typeable

import Erebos.Error
import Erebos.Identity
import Erebos.Object
import Erebos.State


data MessageExtra
    = UserJoined
    | UserLeft


class (Typeable conv, Typeable msg) => ConversationType conv msg | conv -> msg, msg -> conv where
    convMessageFrom :: msg -> ComposedIdentity
    convMessageTime :: msg -> ZonedTime
    convMessageText :: msg -> Maybe Text
    convMessageExtra :: msg -> [ MessageExtra ]
    convMessageExtra _ = []

    convReference :: conv -> RefDigest
    convMessageListSince
        :: Maybe conv -- ^ Original state to diff from
        -> conv       -- ^ Current state
        -> ( Int, [ ( msg, Bool ) ] ) -- ^ Number of removed, list of added messages

    convMarkAllSeen :: (MonadHead LocalState m, MonadError e m, FromErebosError e) => conv -> m ()