{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE ScopedTypeVariables #-}
module MailboxTestFilters where
import Control.Distributed.Process
import Control.Distributed.Process.Execution.Mailbox (FilterResult(..))
import Control.Monad (forM)
#if ! MIN_VERSION_base(4,6,0)
import Prelude hiding (catch, drop)
#else
import Prelude hiding (drop)
#endif
import Data.Maybe (catMaybes)
import Control.Distributed.Process.Closure (remotable, mkClosure, mkStaticClosure)
filterInputs :: (String, Int, Bool) -> Message -> Process FilterResult
filterInputs (s, i, b) msg = do
rs <- forM [ \m -> handleMessageIf m (\s' -> s' == s) (\_ -> return Keep)
, \m -> handleMessageIf m (\i' -> i' == i) (\_ -> return Keep)
, \m -> handleMessageIf m (\b' -> b' == b) (\_ -> return Keep)
] $ \h -> h msg
if (length (catMaybes rs) > 0)
then return Keep
else return Skip
filterEvens :: Message -> Process FilterResult
filterEvens m = do
matched <- handleMessage m (\(i :: Int) -> do
if even i then return Keep else return Skip)
case matched of
Just fr -> return fr
_ -> return Skip
$(remotable ['filterInputs, 'filterEvens])
intFilter :: Closure (Message -> Process FilterResult)
intFilter = $(mkStaticClosure 'filterEvens)
myFilter :: (String, Int, Bool) -> Closure (Message -> Process FilterResult)
myFilter = $(mkClosure 'filterInputs)