{-# OPTIONS --cubical-compatible --safe #-}
module Reflection.TCM.Effectful where
open import Effect.Choice
open import Effect.Empty
open import Effect.Functor
open import Effect.Applicative
open import Effect.Monad
open import Data.List.Base using ([])
open import Function.Base using (_∘_)
open import Level
open import Reflection.TCM
private
  variable
    ℓ : Level
functor : RawFunctor {ℓ} TC
functor = record
  { _<$>_ = λ f mx → bindTC mx (pure ∘ f)
  }
applicative : RawApplicative {ℓ} TC
applicative = record
  { rawFunctor = functor
  ; pure = pure
  ; _<*>_  = λ mf mx → bindTC mf λ f → bindTC mx (pure ∘ f)
  }
empty : RawEmpty {ℓ} TC
empty = record { empty = typeError [] }
applicativeZero : RawApplicativeZero {ℓ} TC
applicativeZero = record
  { rawApplicative = applicative
  ; rawEmpty = empty
  }
choice : RawChoice {ℓ} TC
choice = record { _<|>_ = catchTC }
alternative : RawAlternative {ℓ} TC
alternative = record
  { rawApplicativeZero = applicativeZero
  ; rawChoice = choice
  }
monad : RawMonad {ℓ} TC
monad = record
  { rawApplicative = applicative
  ; _>>=_  = bindTC
  }
monadZero : RawMonadZero {ℓ} TC
monadZero = record
  { rawMonad = monad
  ; rawEmpty = empty
  }
monadPlus : RawMonadPlus {ℓ} TC
monadPlus = record
  { rawMonadZero = monadZero
  ; rawChoice = choice
  }