Quick actions

cmd+k|ctrl+k

Navigation

Languages

ZIO in Haskell

Snippet info

Language

Haskell

Visibility

public

Author

rightfold

Created

2019-07-13T10:26:53Z

Updated

2019-07-13T10:35:01Z

{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MagicHash #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE UnboxedTuples #-}

import Control.Monad.Reader.Class (MonadReader (..))
import Data.Void (Void)
import GHC.IO (IO (..))
import GHC.Prim (RealWorld, State#)

newtype ZIO s r e a =
  ZIO ((# State# s, r #) -> (# State# s, a #))

instance Functor (ZIO s r e) where
  fmap f (ZIO z) =
    ZIO $ \(# s, r #) ->
      let (# s', a #) = z (# s, r #) in
      (# s', f a #)

instance Applicative (ZIO s r e) where
  pure x = ZIO $ \(# s, _ #) -> (# s, x #)
  ZIO z <*> ZIO aa =
    ZIO $ \(# s, r #) ->
      let (# s', z' #) = z (# s, r #) in
      let (# s'', aa' #) = aa (# s', r #) in
      (# s'', z' aa' #)

instance Monad (ZIO s r e) where
  ZIO z >>= k =
    ZIO $ \(# s, r #) ->
      let (# s', a #) = z (# s, r #) in
      let ZIO aa = k a in
      aa (# s', r #)

instance MonadReader r (ZIO s r e) where
  ask = ZIO $ \(# s, r #) -> (# s, r #)
  local f (ZIO z) =
    ZIO $ \(# s, r #) ->
      z (# s, f r #)

runZIO :: ZIO RealWorld r Void a -> r -> IO a
runZIO (ZIO z) r =
  IO $ \s -> z (# s, r #)

main' :: ZIO s r e ()
main' = pure ()

main :: IO ()
main = runZIO main' ()
INFO