Permalink
Fetching contributors…
Cannot retrieve contributors at this time
63 lines (56 sloc) 2.03 KB
-----------------------------------------------------------------------------
-- |
-- Module : Control.Distributed.Process.Extras.UnsafePrimitives
-- Copyright : (c) Tim Watson 2013 - 2017
-- License : BSD3 (see the file LICENSE)
--
-- Maintainer : Tim Watson <watson.timothy@gmail.com>
-- Stability : experimental
-- Portability : non-portable (requires concurrency)
--
-- [Unsafe Messaging Primitives Using NFData]
--
-- This module mirrors "Control.Distributed.Process.UnsafePrimitives", but
-- attempts to provide a bit more safety by forcing evaluation before sending.
-- This is handled using @NFData@, by means of the @NFSerializable@ type class.
--
-- Note that we /still/ cannot guarantee that both the @NFData@ and @Binary@
-- instances will evaluate your data the same way, therefore these primitives
-- still have certain risks and potential side effects. Use with caution.
--
-----------------------------------------------------------------------------
module Control.Distributed.Process.Extras.UnsafePrimitives
( send
, nsend
, sendToAddr
, sendChan
, wrapMessage
) where
import Control.DeepSeq (($!!))
import Control.Distributed.Process
( Process
, ProcessId
, SendPort
, Message
)
import Control.Distributed.Process.Extras.Internal.Types
( NFSerializable
, Addressable
, Resolvable(..)
)
import qualified Control.Distributed.Process.UnsafePrimitives as Unsafe
send :: NFSerializable m => ProcessId -> m -> Process ()
send pid msg = Unsafe.send pid $!! msg
nsend :: NFSerializable a => String -> a -> Process ()
nsend name msg = Unsafe.nsend name $!! msg
sendToAddr :: (Addressable a, NFSerializable m) => a -> m -> Process ()
sendToAddr addr msg = do
mPid <- resolve addr
case mPid of
Nothing -> return ()
Just p -> send p msg
sendChan :: (NFSerializable m) => SendPort m -> m -> Process ()
sendChan port msg = Unsafe.sendChan port $!! msg
-- | Create an unencoded @Message@ for any @Serializable@ type.
wrapMessage :: NFSerializable a => a -> Message
wrapMessage msg = Unsafe.wrapMessage $!! msg