{- |
Module      :  Control.Monad.Trans.Indexed.Do
Copyright   :  (C) 2024 Eitan Chatav
License     :  BSD 3-Clause License (see the file LICENSE)
Maintainer  :  Eitan Chatav <eitan.chatav@gmail.com>

Qualified @Indexed.do@ notation.

>>> :set -XQualifiedDo
>>> import qualified Control.Monad.Trans.Indexed.Do as Indexed
-}

module Control.Monad.Trans.Indexed.Do
  ( (>>=)
  , (>>)
  , return
  , fail
  ) where

import qualified Control.Monad as M
import qualified Control.Monad.Trans as T
import qualified Control.Monad.Trans.Indexed as Ix
import Prelude hiding ((>>=), (>>), fail)

(>>=)
  :: (Ix.IxMonadTrans t, M.Monad m)
  => t i j m x
  -> (x -> t j k m y)
  -> t i k m y
>>= :: forall {k} (t :: k -> k -> (* -> *) -> * -> *) (m :: * -> *)
       (i :: k) (j :: k) x (k :: k) y.
(IxMonadTrans t, Monad m) =>
t i j m x -> (x -> t j k m y) -> t i k m y
(>>=) = ((x -> t j k m y) -> t i j m x -> t i k m y)
-> t i j m x -> (x -> t j k m y) -> t i k m y
forall a b c. (a -> b -> c) -> b -> a -> c
flip (x -> t j k m y) -> t i j m x -> t i k m y
forall k (t :: k -> k -> (* -> *) -> * -> *) (m :: * -> *) x
       (j :: k) (k1 :: k) y (i :: k).
(IxMonadTrans t, Monad m) =>
(x -> t j k1 m y) -> t i j m x -> t i k1 m y
forall (m :: * -> *) x (j :: k) (k1 :: k) y (i :: k).
Monad m =>
(x -> t j k1 m y) -> t i j m x -> t i k1 m y
Ix.bindIx

(>>)
  :: (Ix.IxMonadTrans t, M.Monad m)
  => t i j m x
  -> t j k m y
  -> t i k m y
>> :: forall {k} (t :: k -> k -> (* -> *) -> * -> *) (m :: * -> *)
       (i :: k) (j :: k) x (k :: k) y.
(IxMonadTrans t, Monad m) =>
t i j m x -> t j k m y -> t i k m y
(>>) = (t j k m y -> t i j m x -> t i k m y)
-> t i j m x -> t j k m y -> t i k m y
forall a b c. (a -> b -> c) -> b -> a -> c
flip t j k m y -> t i j m x -> t i k m y
forall k (t :: k -> k -> (* -> *) -> * -> *) (m :: * -> *) (j :: k)
       (k1 :: k) y (i :: k) x.
(IxMonadTrans t, Monad m) =>
t j k1 m y -> t i j m x -> t i k1 m y
forall (m :: * -> *) (j :: k) (k1 :: k) y (i :: k) x.
Monad m =>
t j k1 m y -> t i j m x -> t i k1 m y
Ix.thenIx

fail
  :: (Ix.IxMonadTrans t, M.MonadFail m, i ~ j)
  => String
  -> t i j m x
fail :: forall {k} (t :: k -> k -> (* -> *) -> * -> *) (m :: * -> *)
       (i :: k) (j :: k) x.
(IxMonadTrans t, MonadFail m, i ~ j) =>
String -> t i j m x
fail = m x -> t i j m x
forall (m :: * -> *) a. Monad m => m a -> t i j m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
T.lift (m x -> t i j m x) -> (String -> m x) -> String -> t i j m x
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> m x
forall a. String -> m a
forall (m :: * -> *) a. MonadFail m => String -> m a
M.fail