hyperthunk/distributed-process-platform — pull request #23 by rodlogic (2012-12-10 12:45:59+00:00)
Title: Support for Async and async calls (Issue #8)

This extracts a reusable Async module and adds an explicit callTimeout. So now we have:
```haskell
call :: (Serializable rq, Show rq, Serializable rs, Show rs) => ServerId -> rq -> Process rs

callTimeout :: (Serializable rq, Show rq, Serializable rs, Show rs) => ServerId -> Timeout -> rq -> Process (Maybe rs)

-- | Async call to a server
callAsync :: (Serializable rq, Show rq, Serializable rs, Show rs) => ServerId -> rq -> Process (Async rs)
```

And the Async module, provides:
```haskell
async :: (Serializable b) => ProcessId -> Process () -> Process (Async b)

-- | Wait for the call response
wait :: (Serializable a, Show a) => Async a -> Process a

-- | Wait for the call response given a timeout
waitTimeout :: (Serializable a, Show a) => Async a -> Timeout -> Process (Maybe a)
```

Sync calls working as before, but async calls still has some issues.