diff --git a/bower.json b/bower.json index 2435142..55c9da3 100644 --- a/bower.json +++ b/bower.json @@ -19,7 +19,8 @@ "dependencies": { "purescript-prelude": "^4.0.0", "purescript-tailrec": "^4.0.0", - "purescript-partial": "^2.0.0" + "purescript-partial": "^2.0.0", + "purescript-unsafe-coerce": "^4.0.0" }, "devDependencies": { "purescript-console": "^4.0.0" diff --git a/src/Control/Monad/ST/Class.purs b/src/Control/Monad/ST/Class.purs new file mode 100644 index 0000000..ec429f9 --- /dev/null +++ b/src/Control/Monad/ST/Class.purs @@ -0,0 +1,17 @@ +module Control.Monad.ST.Class where + +import Prelude + +import Control.Monad.ST (ST) +import Control.Monad.ST.Global (Global) +import Control.Monad.ST.Global as Global +import Effect (Effect) + +class MonadST s m | m -> s where + liftST :: ST s ~> m + +instance monadSTEffect :: MonadST Global Effect where + liftST = Global.toEffect + +instance monadSTST :: MonadST s (ST s) where + liftST = identity diff --git a/src/Control/Monad/ST/Global.purs b/src/Control/Monad/ST/Global.purs new file mode 100644 index 0000000..d1c82b1 --- /dev/null +++ b/src/Control/Monad/ST/Global.purs @@ -0,0 +1,18 @@ +module Control.Monad.ST.Global + ( Global + , toEffect + ) where + +import Prelude + +import Control.Monad.ST (ST, kind Region) +import Effect (Effect) +import Unsafe.Coerce (unsafeCoerce) + +-- | This region allows `ST` computations to be converted into `Effect` +-- | computations so they can be run in a global context. +foreign import data Global :: Region + +-- | Converts an `ST` computation into an `Effect` computation. +toEffect :: ST Global ~> Effect +toEffect = unsafeCoerce