data Tag = MkTag

data Elem :  a -> List a ->Type where
  Z : Elem a (a :: as)
  S : Elem a as -> Elem a (b :: as)

toNat : Elem as a -> Nat
toNat Z = 0
toNat (S n) = 1 + toNat n

Show (Elem as a) where
  show = show . toNat

data Subset : List a -> List a -> Type where
  Nil  : Subset [] bs
  (::) : Elem a bs -> Subset as bs -> Subset (a :: as) bs

toList : Subset as bs -> List Nat
toList [] = []
toList (n :: ns) = toNat n :: toList ns

Show (Subset as bs) where
  show = show . toList

search : {auto prf : a} -> a
search = prf

test : String
test =
  let x : Tag := MkTag
      y : Tag := MkTag

      as : List Tag
      as = [y,x]

      bs : List Tag
      bs = [x,y,y]

      prf : Subset as bs
      prf = search

      prf' : Subset as bs := search

      eq : prf === [S (S Z), Z] := Refl

--      eq' : prf' === [S (S Z), Z] := Refl
-- ^ does not work because  prf' is opaque

  in show prf


reverse : List a -> List a
reverse xs =
  let revOnto : List a -> List a -> List a
      revOnto acc [] = acc
      revOnto acc (x :: xs) = revOnto (x :: acc) xs

      rev := revOnto []

      result := rev xs

  in result