module Haskell.Prim.Absurd where
open import Haskell.Prim
open import Agda.Builtin.Reflection renaming (bindTC to _>>=_; absurd to absurdP)
private
pattern vArg x = arg (arg-info visible (modality relevant quantity-ω)) x
refute : Nat → Term
refute i = def (quote _$_) ( vArg (pat-lam (absurd-clause [] (vArg (absurdP 0) ∷ []) ∷ []) [])
∷ vArg (var i []) ∷ [])
tryRefute : Nat → Term → TC ⊤
tryRefute 0 _ = typeError (strErr "No variable of empty type found in the context" ∷ [])
tryRefute (suc n) hole = catchTC (unify hole (refute n)) (tryRefute n hole)
absurd : Term → TC ⊤
absurd hole = do
Γ ← getContext
tryRefute (lengthNat Γ) hole