module Control.Eff.Concurrent.Api.GenServer
where
import Control.DeepSeq
import Control.Eff
import Control.Eff.Concurrent.Api
import Control.Eff.Concurrent.Process
import Control.Eff.Log
import Control.Eff.State.Lazy
import Data.Dynamic
import Data.Kind
import Data.Text as T
class (Typeable (GenServerState a), NFData (GenServerState a)) =>
GenServer a eff
where
type GenServerState a :: Type
genServerInit :: ('[Interrupts, Logs] <:: eff, SetMember Process (Process q) eff) => a -> Eff eff (GenServerState a)
genServerHandle ::
('[Interrupts, Logs] <:: eff, SetMember Process (Process q) eff)
=> Api a v
-> Eff (State (GenServerState a) ': eff) (ApiReply v)
genServerInterrupt ::
('[Interrupts, Logs] <:: eff, SetMember Process (Process q) eff)
=> InterruptReason
-> Eff (State (GenServerState a) ': eff) ()
genServerInfoCommand :: Api a ('Synchronous Text)
type family ApiReply (s :: Synchronicity) where
ApiReply ('Synchronous t) = Maybe t
ApiReply 'Asynchronous = ()
data SomeMessage a =
MkSomeMessage
data instance Api (SomeMessage a) s where
SomeMessage :: a -> Api (SomeMessage a) 'Asynchronous
runGenServer ::
forall q e h a. (GenServer a e, SetMember Process (Process q) e, Member Interrupts e, LogsTo h e)
=> a
-> Eff e (Server a)
runGenServer initArg = error "TODO"