{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
module Async.Worker.Broker.Types
( Queue(..)
, renderQueue
, TimeoutS(..)
, MessageBroker(..)
, SerializableMessage
)
where
import Data.Aeson (FromJSON, ToJSON)
import Data.Kind (Type)
import Data.String (IsString)
import Data.Text qualified as T
import Data.Typeable (Typeable)
newtype Queue = Queue { Queue -> Text
_Queue :: T.Text }
deriving stock (Queue -> Queue -> Bool
(Queue -> Queue -> Bool) -> (Queue -> Queue -> Bool) -> Eq Queue
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Queue -> Queue -> Bool
== :: Queue -> Queue -> Bool
$c/= :: Queue -> Queue -> Bool
/= :: Queue -> Queue -> Bool
Eq, Eq Queue
Eq Queue =>
(Queue -> Queue -> Ordering)
-> (Queue -> Queue -> Bool)
-> (Queue -> Queue -> Bool)
-> (Queue -> Queue -> Bool)
-> (Queue -> Queue -> Bool)
-> (Queue -> Queue -> Queue)
-> (Queue -> Queue -> Queue)
-> Ord Queue
Queue -> Queue -> Bool
Queue -> Queue -> Ordering
Queue -> Queue -> Queue
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: Queue -> Queue -> Ordering
compare :: Queue -> Queue -> Ordering
$c< :: Queue -> Queue -> Bool
< :: Queue -> Queue -> Bool
$c<= :: Queue -> Queue -> Bool
<= :: Queue -> Queue -> Bool
$c> :: Queue -> Queue -> Bool
> :: Queue -> Queue -> Bool
$c>= :: Queue -> Queue -> Bool
>= :: Queue -> Queue -> Bool
$cmax :: Queue -> Queue -> Queue
max :: Queue -> Queue -> Queue
$cmin :: Queue -> Queue -> Queue
min :: Queue -> Queue -> Queue
Ord)
deriving newtype (NonEmpty Queue -> Queue
Queue -> Queue -> Queue
(Queue -> Queue -> Queue)
-> (NonEmpty Queue -> Queue)
-> (forall b. Integral b => b -> Queue -> Queue)
-> Semigroup Queue
forall b. Integral b => b -> Queue -> Queue
forall a.
(a -> a -> a)
-> (NonEmpty a -> a)
-> (forall b. Integral b => b -> a -> a)
-> Semigroup a
$c<> :: Queue -> Queue -> Queue
<> :: Queue -> Queue -> Queue
$csconcat :: NonEmpty Queue -> Queue
sconcat :: NonEmpty Queue -> Queue
$cstimes :: forall b. Integral b => b -> Queue -> Queue
stimes :: forall b. Integral b => b -> Queue -> Queue
Semigroup, String -> Queue
(String -> Queue) -> IsString Queue
forall a. (String -> a) -> IsString a
$cfromString :: String -> Queue
fromString :: String -> Queue
IsString, Int -> Queue -> ShowS
[Queue] -> ShowS
Queue -> String
(Int -> Queue -> ShowS)
-> (Queue -> String) -> ([Queue] -> ShowS) -> Show Queue
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Queue -> ShowS
showsPrec :: Int -> Queue -> ShowS
$cshow :: Queue -> String
show :: Queue -> String
$cshowList :: [Queue] -> ShowS
showList :: [Queue] -> ShowS
Show)
newtype TimeoutS = TimeoutS { TimeoutS -> Int
_TimeoutS :: Int }
deriving stock (TimeoutS -> TimeoutS -> Bool
(TimeoutS -> TimeoutS -> Bool)
-> (TimeoutS -> TimeoutS -> Bool) -> Eq TimeoutS
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: TimeoutS -> TimeoutS -> Bool
== :: TimeoutS -> TimeoutS -> Bool
$c/= :: TimeoutS -> TimeoutS -> Bool
/= :: TimeoutS -> TimeoutS -> Bool
Eq, Eq TimeoutS
Eq TimeoutS =>
(TimeoutS -> TimeoutS -> Ordering)
-> (TimeoutS -> TimeoutS -> Bool)
-> (TimeoutS -> TimeoutS -> Bool)
-> (TimeoutS -> TimeoutS -> Bool)
-> (TimeoutS -> TimeoutS -> Bool)
-> (TimeoutS -> TimeoutS -> TimeoutS)
-> (TimeoutS -> TimeoutS -> TimeoutS)
-> Ord TimeoutS
TimeoutS -> TimeoutS -> Bool
TimeoutS -> TimeoutS -> Ordering
TimeoutS -> TimeoutS -> TimeoutS
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: TimeoutS -> TimeoutS -> Ordering
compare :: TimeoutS -> TimeoutS -> Ordering
$c< :: TimeoutS -> TimeoutS -> Bool
< :: TimeoutS -> TimeoutS -> Bool
$c<= :: TimeoutS -> TimeoutS -> Bool
<= :: TimeoutS -> TimeoutS -> Bool
$c> :: TimeoutS -> TimeoutS -> Bool
> :: TimeoutS -> TimeoutS -> Bool
$c>= :: TimeoutS -> TimeoutS -> Bool
>= :: TimeoutS -> TimeoutS -> Bool
$cmax :: TimeoutS -> TimeoutS -> TimeoutS
max :: TimeoutS -> TimeoutS -> TimeoutS
$cmin :: TimeoutS -> TimeoutS -> TimeoutS
min :: TimeoutS -> TimeoutS -> TimeoutS
Ord)
deriving newtype (Integer -> TimeoutS
TimeoutS -> TimeoutS
TimeoutS -> TimeoutS -> TimeoutS
(TimeoutS -> TimeoutS -> TimeoutS)
-> (TimeoutS -> TimeoutS -> TimeoutS)
-> (TimeoutS -> TimeoutS -> TimeoutS)
-> (TimeoutS -> TimeoutS)
-> (TimeoutS -> TimeoutS)
-> (TimeoutS -> TimeoutS)
-> (Integer -> TimeoutS)
-> Num TimeoutS
forall a.
(a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (Integer -> a)
-> Num a
$c+ :: TimeoutS -> TimeoutS -> TimeoutS
+ :: TimeoutS -> TimeoutS -> TimeoutS
$c- :: TimeoutS -> TimeoutS -> TimeoutS
- :: TimeoutS -> TimeoutS -> TimeoutS
$c* :: TimeoutS -> TimeoutS -> TimeoutS
* :: TimeoutS -> TimeoutS -> TimeoutS
$cnegate :: TimeoutS -> TimeoutS
negate :: TimeoutS -> TimeoutS
$cabs :: TimeoutS -> TimeoutS
abs :: TimeoutS -> TimeoutS
$csignum :: TimeoutS -> TimeoutS
signum :: TimeoutS -> TimeoutS
$cfromInteger :: Integer -> TimeoutS
fromInteger :: Integer -> TimeoutS
Num, Int -> TimeoutS -> ShowS
[TimeoutS] -> ShowS
TimeoutS -> String
(Int -> TimeoutS -> ShowS)
-> (TimeoutS -> String) -> ([TimeoutS] -> ShowS) -> Show TimeoutS
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> TimeoutS -> ShowS
showsPrec :: Int -> TimeoutS -> ShowS
$cshow :: TimeoutS -> String
show :: TimeoutS -> String
$cshowList :: [TimeoutS] -> ShowS
showList :: [TimeoutS] -> ShowS
Show)
renderQueue :: Queue -> String
renderQueue :: Queue -> String
renderQueue = Text -> String
T.unpack (Text -> String) -> (Queue -> Text) -> Queue -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Queue -> Text
_Queue
type SerializableMessage a = ( FromJSON a
, ToJSON a
, Typeable a )
class (
Eq (MessageId b)
, Show (MessageId b)
, Ord (MessageId b)
, ToJSON (MessageId b)
, FromJSON (MessageId b)
, Show (BrokerMessage b a)
) => MessageBroker b a where
data family Broker b a :: Type
data family BrokerMessage b a :: Type
data family Message b a :: Type
data family MessageId b :: Type
data family BrokerInitParams b a :: Type
messageId :: BrokerMessage b a -> MessageId b
getMessage :: BrokerMessage b a -> Message b a
toMessage :: a -> Message b a
toA :: Message b a -> a
initBroker :: BrokerInitParams b a -> IO (Broker b a)
deinitBroker :: Broker b a -> IO ()
createQueue :: Broker b a -> Queue -> IO ()
dropQueue :: Broker b a -> Queue -> IO ()
readMessageWaiting :: Broker b a -> Queue -> IO (BrokerMessage b a)
popMessageWaiting :: Broker b a -> Queue -> IO (BrokerMessage b a)
setMessageTimeout :: Broker b a -> Queue -> MessageId b -> TimeoutS -> IO ()
sendMessage :: Broker b a -> Queue -> Message b a -> IO (MessageId b)
sendMessageDelayed :: Broker b a -> Queue -> Message b a -> TimeoutS -> IO (MessageId b)
deleteMessage :: Broker b a -> Queue -> MessageId b -> IO ()
archiveMessage :: Broker b a -> Queue -> MessageId b -> IO ()
getQueueSize :: Broker b a -> Queue -> IO Int
getArchivedMessage :: Broker b a -> Queue -> MessageId b -> IO (Maybe (BrokerMessage b a))
listPendingMessageIds :: Broker b a -> Queue -> IO [MessageId b]
getMessageById :: Broker b a -> Queue -> MessageId b -> IO (Maybe (BrokerMessage b a))