open import Agda.Builtin.Nat using (Nat; _+_)

-- ** no unused type parameters
data Either (A B : Set) : Set where
  Left  : A → Either A B
  Right : B → Either A B

fromEitherAB : ∀ {A B : Set} → A → Either A B → A
fromEitherAB _    (Left  a) = a
fromEitherAB defA (Right _) = defA

fromEither : ∀ {A : Set} → A → ∀ {B : Set} → Either A B → A
fromEither _    (Left  a) = a
fromEither defA (Right _) = defA

-- ** unused type parameters present
data OnlyLeft (A B : Set) : Set where
  Left : A → OnlyLeft A B

private variable A B C : Set

fromOnlyLeft : OnlyLeft A B → A
fromOnlyLeft (Left a) = a

fromOnlyLeft2 : OnlyLeft (OnlyLeft A B) C → A
fromOnlyLeft2 (Left (Left a)) = a

record OnlyLeftR (A B : Set) : Set where
  field left : A
open OnlyLeftR public

fromOnlyLeftR : OnlyLeftR A B → A
fromOnlyLeftR r = r .left

fromOnlyLeftR2 : OnlyLeftR (OnlyLeftR A B) C → A
fromOnlyLeftR2 r = r .left .left

open import Agda.Builtin.Nat

test : Nat
test = fromEitherAB {B = Nat} 42 (Left 0)
     + fromEither 0 {B = Nat} (Right 42)
     + fromOnlyLeft {B = Nat} (Left 0)
     + fromOnlyLeft2 {B = Nat} {C = Nat} (Left (Left 0))
     + fromOnlyLeftR2 {B = Nat} {C = Nat} (record { left = record { left = 42 } })
{-# COMPILE AGDA2LAMBOX test #-}
Debug λ☐ Rocq
  ↪  
WASM C OCaml CakeML Rust Elm
  ↪  
  ↪