0 | module Data.SnocVect.Elem
3 | import Decidable.Equality
8 | data Elem : SnocVect k a -> a -> Type where
9 | Here : Elem (sx :< x) x
10 | There : Elem sx x -> Elem (sx :< y) x
13 | {sx : SnocVect 0 a} -> Uninhabited (Elem sx x) where
14 | uninhabited Here
impossible
15 | uninhabited (There x
) impossible
17 | neitherHereNorThere : DecEq a => {0 x,y : a} ->
20 | Not (Elem (sy :< y) x)
21 | neitherHereNorThere _ notThere (There z) = notThere z
22 | neitherHereNorThere notHere _ Here = notHere Refl
25 | isElem : DecEq a => (x : a) -> (sx : SnocVect k a) -> Dec (Elem sx x)
26 | isElem x [<] = No absurd
27 | isElem x (sx :< y) with (decEq x y)
28 | isElem y (sx :< y) | (Yes Refl) = Yes Here
29 | isElem x (sx :< y) | (No contra) with (isElem x sx)
30 | isElem x (sx :< y) | (No _) | (Yes prf) = Yes (There prf)
31 | isElem x (sx :< y) | (No yNotX) | (No xNotInSx) =
32 | No (neitherHereNorThere yNotX xNotInSx)