summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoman Smrž <roman.smrz@seznam.cz>2025-11-16 10:51:44 +0100
committerRoman Smrž <roman.smrz@seznam.cz>2025-11-16 19:27:04 +0100
commit5be8f266e0af73917d8b73797c94333f7806b7c8 (patch)
tree17643786f659b8f7412744ad237ac5c62dfeaf7c
parent8b0a70f002d55ea68c092997d3e7721aef2ee0b7 (diff)
Conversation type class
-rw-r--r--erebos.cabal1
-rw-r--r--src/Erebos/Chatroom.hs7
-rw-r--r--src/Erebos/Conversation.hs14
-rw-r--r--src/Erebos/Conversation/Class.hs15
-rw-r--r--src/Erebos/DirectMessage.hs8
5 files changed, 39 insertions, 6 deletions
diff --git a/erebos.cabal b/erebos.cabal
index 4aabb73..1937b97 100644
--- a/erebos.cabal
+++ b/erebos.cabal
@@ -125,6 +125,7 @@ library
Erebos.Sync
other-modules:
+ Erebos.Conversation.Class
Erebos.Flow
Erebos.Network.Address
Erebos.Network.Channel
diff --git a/src/Erebos/Chatroom.hs b/src/Erebos/Chatroom.hs
index f9bf545..bdb101f 100644
--- a/src/Erebos/Chatroom.hs
+++ b/src/Erebos/Chatroom.hs
@@ -50,6 +50,7 @@ import Data.Set qualified as S
import Data.Text (Text)
import Data.Time
+import Erebos.Conversation.Class
import Erebos.Identity
import Erebos.PubKey
import Erebos.Service
@@ -61,6 +62,12 @@ import Erebos.Storage.Merge
import Erebos.Util
+instance ConversationType ChatroomState ChatMessage where
+ convMessageFrom = cmsgFrom
+ convMessageTime = cmsgTime
+ convMessageText = cmsgText
+
+
data ChatroomData = ChatroomData
{ rdPrev :: [Stored (Signed ChatroomData)]
, rdName :: Maybe Text
diff --git a/src/Erebos/Conversation.hs b/src/Erebos/Conversation.hs
index 2d007c9..ff8396c 100644
--- a/src/Erebos/Conversation.hs
+++ b/src/Erebos/Conversation.hs
@@ -33,6 +33,7 @@ import Data.Time.Format
import Data.Time.LocalTime
import Erebos.Chatroom
+import Erebos.Conversation.Class
import Erebos.DirectMessage
import Erebos.Identity
import Erebos.State
@@ -42,17 +43,18 @@ import Erebos.Storable
data Message = DirectMessageMessage DirectMessage Bool
| ChatroomMessage ChatMessage Bool
+withMessage :: (forall conv msg. ConversationType conv msg => msg -> a) -> Message -> a
+withMessage f (DirectMessageMessage msg _) = f msg
+withMessage f (ChatroomMessage msg _) = f msg
+
messageFrom :: Message -> ComposedIdentity
-messageFrom (DirectMessageMessage msg _) = msgFrom msg
-messageFrom (ChatroomMessage msg _) = cmsgFrom msg
+messageFrom = withMessage convMessageFrom
messageTime :: Message -> ZonedTime
-messageTime (DirectMessageMessage msg _) = msgTime msg
-messageTime (ChatroomMessage msg _) = cmsgTime msg
+messageTime = withMessage convMessageTime
messageText :: Message -> Maybe Text
-messageText (DirectMessageMessage msg _) = Just $ msgText msg
-messageText (ChatroomMessage msg _) = cmsgText msg
+messageText = withMessage convMessageText
messageUnread :: Message -> Bool
messageUnread (DirectMessageMessage _ unread) = unread
diff --git a/src/Erebos/Conversation/Class.hs b/src/Erebos/Conversation/Class.hs
new file mode 100644
index 0000000..909dac6
--- /dev/null
+++ b/src/Erebos/Conversation/Class.hs
@@ -0,0 +1,15 @@
+module Erebos.Conversation.Class (
+ ConversationType(..),
+) where
+
+import Data.Text (Text)
+import Data.Time.LocalTime
+import Data.Typeable
+
+import Erebos.Identity
+
+
+class (Typeable conv, Typeable msg) => ConversationType conv msg | conv -> msg, msg -> conv where
+ convMessageFrom :: msg -> ComposedIdentity
+ convMessageTime :: msg -> ZonedTime
+ convMessageText :: msg -> Maybe Text
diff --git a/src/Erebos/DirectMessage.hs b/src/Erebos/DirectMessage.hs
index f518b57..2558abb 100644
--- a/src/Erebos/DirectMessage.hs
+++ b/src/Erebos/DirectMessage.hs
@@ -32,6 +32,7 @@ import Data.Text qualified as T
import Data.Time.Format
import Data.Time.LocalTime
+import Erebos.Conversation.Class
import Erebos.Discovery
import Erebos.Identity
import Erebos.Network
@@ -42,6 +43,13 @@ import Erebos.Storable
import Erebos.Storage.Head
import Erebos.Storage.Merge
+
+instance ConversationType DirectMessageThread DirectMessage where
+ convMessageFrom = msgFrom
+ convMessageTime = msgTime
+ convMessageText = Just . msgText
+
+
data DirectMessage = DirectMessage
{ msgFrom :: ComposedIdentity
, msgPrev :: [ Stored DirectMessage ]