module Network.ZRE.Lib where

import Control.Applicative
import Control.Monad
import Data.ByteString (ByteString)

import qualified Data.ByteString.Char8

import Data.ZRE (Group)
import Network.ZRE.Types

zrecvWithShout :: Group
               -> (ByteString -> ZRE ())
               -> ZRE ()
zrecvWithShout :: Group -> (ByteString -> ZRE ()) -> ZRE ()
zrecvWithShout Group
group ByteString -> ZRE ()
f = do
  Event
e <- ZRE Event
zrecv
  case Event
e of
    Shout UUID
_ Group
forGroup Content
content UTCTime
_time | Group
forGroup Group -> Group -> Bool
forall a. Eq a => a -> a -> Bool
== Group
group ->
      ByteString -> ZRE ()
f (Content -> ByteString
Data.ByteString.Char8.concat Content
content)

    Event
_ | Bool
otherwise -> () -> ZRE ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()

zrecvShouts :: Group
            -> (ByteString -> ZRE ())
            -> ZRE ()
zrecvShouts :: Group -> (ByteString -> ZRE ()) -> ZRE ()
zrecvShouts Group
group ByteString -> ZRE ()
fn = ZRE () -> ZRE ()
forall (f :: * -> *) a b. Applicative f => f a -> f b
forever (ZRE () -> ZRE ()) -> ZRE () -> ZRE ()
forall a b. (a -> b) -> a -> b
$ Group -> (ByteString -> ZRE ()) -> ZRE ()
zrecvWithShout Group
group ByteString -> ZRE ()
fn

zrecvShoutsDecode :: Group
                  -> (ByteString -> Either String decoded)
                  -> (Either String decoded -> ZRE ())
                  -> ZRE ()
zrecvShoutsDecode :: Group
-> (ByteString -> Either String decoded)
-> (Either String decoded -> ZRE ())
-> ZRE ()
zrecvShoutsDecode Group
group ByteString -> Either String decoded
decFn Either String decoded -> ZRE ()
handler = Group -> (ByteString -> ZRE ()) -> ZRE ()
zrecvShouts Group
group ((ByteString -> ZRE ()) -> ZRE ())
-> (ByteString -> ZRE ()) -> ZRE ()
forall a b. (a -> b) -> a -> b
$ Either String decoded -> ZRE ()
handler (Either String decoded -> ZRE ())
-> (ByteString -> Either String decoded) -> ByteString -> ZRE ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Either String decoded
decFn

decodeShouts :: (Monad m, Alternative m)
             => (Event -> Either String decoded)
             -> (Either String decoded -> ZRE ())
             -> Event
             -> m (ZRE ())
decodeShouts :: (Event -> Either String decoded)
-> (Either String decoded -> ZRE ()) -> Event -> m (ZRE ())
decodeShouts Event -> Either String decoded
fn Either String decoded -> ZRE ()
action Event
msg = do
  Bool -> m ()
forall (f :: * -> *). Alternative f => Bool -> f ()
guard (Bool -> m ()) -> Bool -> m ()
forall a b. (a -> b) -> a -> b
$ Event -> Bool
isShout Event
msg
  ZRE () -> m (ZRE ())
forall (m :: * -> *) a. Monad m => a -> m a
return (ZRE () -> m (ZRE ())) -> ZRE () -> m (ZRE ())
forall a b. (a -> b) -> a -> b
$ ZRE Event
readZ ZRE Event -> ZRE () -> ZRE ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> (Either String decoded -> ZRE ()
action (Either String decoded -> ZRE ())
-> (Event -> Either String decoded) -> Event -> ZRE ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Event -> Either String decoded
fn (Event -> ZRE ()) -> Event -> ZRE ()
forall a b. (a -> b) -> a -> b
$ Event
msg)

isShout :: Event -> Bool
isShout :: Event -> Bool
isShout (Shout UUID
_uuid Group
_group Content
_content UTCTime
_time) = Bool
True
isShout Event
_ = Bool
False

isGroupMsg :: Group -> Event -> Bool
isGroupMsg :: Group -> Event -> Bool
isGroupMsg Group
group (Shout UUID
_uuid Group
g Content
_content UTCTime
_time) = Group
g Group -> Group -> Bool
forall a. Eq a => a -> a -> Bool
== Group
group
isGroupMsg Group
_ Event
_ = Bool
False

(==>) :: (Monad m, Alternative m) => (t -> Bool) -> b -> t -> m b
==> :: (t -> Bool) -> b -> t -> m b
(==>) t -> Bool
f b
act = (t -> Bool) -> b -> t -> m b
forall (m :: * -> *) t b.
(Monad m, Alternative m) =>
(t -> Bool) -> b -> t -> m b
iff t -> Bool
f b
act

iff :: (Monad m, Alternative m) => (t -> Bool) -> b -> t -> m b
iff :: (t -> Bool) -> b -> t -> m b
iff t -> Bool
f b
act t
msg = do
  Bool -> m ()
forall (f :: * -> *). Alternative f => Bool -> f ()
guard (Bool -> m ()) -> Bool -> m ()
forall a b. (a -> b) -> a -> b
$ t -> Bool
f t
msg
  b -> m b
forall (m :: * -> *) a. Monad m => a -> m a
return (b -> m b) -> b -> m b
forall a b. (a -> b) -> a -> b
$ b
act

match :: [Event -> Maybe (ZRE ())] -> ZRE ()
match :: [Event -> Maybe (ZRE ())] -> ZRE ()
match [Event -> Maybe (ZRE ())]
acts = do
  Event
msg <- ZRE Event
readZ
  [Event -> Maybe (ZRE ())] -> Event -> ZRE ()
go [Event -> Maybe (ZRE ())]
acts Event
msg
  where
    go :: [Event -> Maybe (ZRE ())] -> Event -> ZRE ()
go (Event -> Maybe (ZRE ())
act:[Event -> Maybe (ZRE ())]
rest) Event
m = do
      case Event -> Maybe (ZRE ())
act Event
m of
        Maybe (ZRE ())
Nothing -> [Event -> Maybe (ZRE ())] -> Event -> ZRE ()
go [Event -> Maybe (ZRE ())]
rest Event
m
        Just ZRE ()
a -> Event -> ZRE ()
unReadZ Event
m ZRE () -> ZRE () -> ZRE ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ZRE ()
a

    go [] Event
_ = () -> ZRE ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()