module Control.Distributed.Process.Async.Internal.Types
(
Async(..)
, AsyncRef
, AsyncTask(..)
, AsyncResult(..)
) where
import Control.Concurrent.STM
import Control.Distributed.Process
import Control.Distributed.Process.Extras (Resolvable(..))
import Control.Distributed.Process.Serializable
( Serializable
, SerializableDict
)
import Data.Binary
import Data.Typeable (Typeable)
import GHC.Generics
type AsyncRef = ProcessId
data Async a = Async {
_asyncWorker :: AsyncRef
, _asyncMonitor :: AsyncRef
, _asyncWait :: STM (AsyncResult a)
}
instance Eq (Async a) where
Async a b _ == Async c d _ = a == c && b == d
instance Resolvable (Async a) where
resolve :: Async a -> Process (Maybe ProcessId)
resolve = return . Just . _asyncWorker
data AsyncTask a =
AsyncTask {
asyncTask :: Process a
}
| AsyncRemoteTask {
asyncTaskDict :: Static (SerializableDict a)
, asyncTaskNode :: NodeId
, asyncTaskProc :: Closure (Process a)
}
data AsyncResult a =
AsyncDone a
| AsyncFailed DiedReason
| AsyncLinkFailed DiedReason
| AsyncCancelled
| AsyncPending
deriving (Typeable, Generic)
instance Serializable a => Binary (AsyncResult a) where
deriving instance Eq a => Eq (AsyncResult a)
deriving instance Show a => Show (AsyncResult a)