idris-0.9.14: libs/base/Data/List.idr
module Data.List
%access public
||| A proof that some element is found in a list
data Elem : a -> List a -> Type where
Here : Elem x (x :: xs)
There : Elem x xs -> Elem x (y :: xs)
instance Uninhabited (Elem {a} x []) where
uninhabited Here impossible
uninhabited (There p) impossible
||| Is the given element a member of the given list.
|||
||| @x The element to be tested.
||| @xs The list to be checked against
isElem : DecEq a => (x : a) -> (xs : List a) -> Dec (Elem x xs)
isElem x [] = No absurd
isElem x (y :: xs) with (decEq x y)
isElem x (x :: xs) | (Yes refl) = Yes Here
isElem x (y :: xs) | (No contra) with (isElem x xs)
isElem x (y :: xs) | (No contra) | (Yes prf) = Yes (There prf)
isElem x (y :: xs) | (No contra) | (No f) = No (mkNo contra f)
where
mkNo : {xs' : List a} ->
((x' = y') -> _|_) -> (Elem x' xs' -> _|_) ->
Elem x' (y' :: xs') -> _|_
mkNo f g Here = f refl
mkNo f g (There x) = g x