bluefin-0.5.0.0: The Bluefin effect system
Safe HaskellNone
LanguageHaskell2010

Bluefin.Prim

Description

For defining PrimMonad instances, for example:

-- Define a handle which includes Prim
data ExAndPrim e = MkExAndPrim (Exception String e) (P.Prim e)
  -- Give it a Handle instance, as per Bluefin.Compound
  deriving (Handle) via OneWayCoercibleHandle ExAndPrim
  deriving stock (Generic)

instance (e :> es) => OneWayCoercible (ExAndPrim e) (ExAndPrim es) where
  oneWayCoercibleImpl = gOneWayCoercible

-- Define a monad M containing the Prim handle
newtype M e es a = MkM (ReaderT (ExAndPrim e) (Eff es) a)
  deriving newtype (Functor, Applicative, Monad)

-- Define a way of running M
runM ::
  (e1 :> es, e2 :> es) =>
  Exception String e1 ->
  P.Prim e2 ->
  M es es r ->
  Eff es r
runM ex prim (MkM m) =
  runReaderT m (MkExAndPrim (mapHandle ex) (mapHandle prim))

-- Give M a PrimMonad instance
instance (e :> es) => PrimMonad (M e es) where
  type PrimState (M e es) = P.PrimStateEff e
  primitive f =
    MkM (ReaderT (\(MkExAndPrim _ prim) -> P.primitive prim f))

-- ghci> example
-- Right ["Hello","World"]
example :: Either String [String]
example = runPureEff $ try $ \ex -> P.runPrim $ \prim -> do
  runM ex prim $ do
    arr <- A.newArray 2 "Hello"
    A.writeArray arr 1 "World"
    for [0, 1] (A.readArray arr)

Documentation

data Prim (e :: Effects) #

Instances

Instances details
Handle Prim 
Instance details

Defined in Bluefin.Internal.Prim

e :> es => OneWayCoercible (Prim e :: Type) (Prim es :: Type) 
Instance details

Defined in Bluefin.Internal.Prim

runPrim #

Arguments

:: forall (es :: Effects) r. (forall (e :: Effects). Prim e -> Eff (e :& es) r) 
-> Eff es r

͘

data PrimStateEff (es :: Effects) #

primitive #

Arguments

:: forall (e1 :: Effects) (es :: Effects) a. e1 :> es 
=> Prim e1 
-> (State# (PrimStateEff e1) -> (# State# (PrimStateEff e1), a #)) 
-> Eff es a

͘