packages feed

linear-base-0.8.1: src/Control/Monad/IO/Class/Linear.hs

{-# LANGUAGE LinearTypes #-}
{-# LANGUAGE NoImplicitPrelude #-}

module Control.Monad.IO.Class.Linear where

import qualified Control.Functor.Linear as Linear
import Prelude.Linear
import qualified System.IO as System
import qualified System.IO.Linear as Linear
import System.IO.Resource.Linear (RIO)
import qualified System.IO.Resource.Linear as RIO

-- | Like 'NonLinear.MonadIO' but allows to lift both linear
-- and non-linear 'IO' actions into a linear monad.
class (Linear.Monad m) => MonadIO m where
  liftIO :: Linear.IO a %1 -> m a
  liftSystemIO :: System.IO a -> m a
  liftSystemIO io = liftIO (Linear.fromSystemIO io)
  liftSystemIOU :: System.IO a -> m (Ur a)
  liftSystemIOU io = liftIO (Linear.fromSystemIOU io)

instance MonadIO Linear.IO where
  liftIO = id

instance MonadIO RIO where
  liftIO = RIO.fromIO

instance (MonadIO m) => MonadIO (Linear.StateT s m) where
  liftIO = Linear.lift . liftIO

instance (MonadIO m, Dupable r) => MonadIO (Linear.ReaderT r m) where
  liftIO = Linear.lift . liftIO