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 ()