13 | module Data.Vect.AtIndex
16 | import Decidable.Equality
21 | data AtIndex : (idx : Fin n)
22 | -> (xs : Vect n type)
26 | Here : AtIndex FZ (x::xs) x
28 | There : (later : AtIndex rest xs x)
29 | -> AtIndex (FS rest) (y::xs) x
33 | elemDiffers : (y = x -> Void)
34 | -> AtIndex FZ (y :: xs) x
40 | elemNotInRest : (AtIndex z xs x -> Void)
41 | -> AtIndex (FS z) (y :: xs) x
43 | elemNotInRest f (There later)
52 | -> (xs : Vect n type)
53 | -> Dec (AtIndex idx xs x)
55 | index FZ
_ []
impossible
56 | index (FS y
) _ []
impossible
58 | index FZ x (y :: xs) with (decEq y x)
59 | index FZ x (x :: xs) | (Yes Refl)
61 | index FZ x (y :: xs) | (No contra)
62 | = No (elemDiffers contra)
64 | index (FS z) x (y :: xs) with (Check.index z x xs)
65 | index (FS z) x (y :: xs) | (Yes prf)
67 | index (FS z) x (y :: xs) | (No contra)
68 | = No (elemNotInRest contra)
72 | elemNotInRest : (DPair type (AtIndex x xs) -> Void)
73 | -> DPair type (AtIndex (FS x) (y :: xs)) -> Void
75 | elemNotInRest f (MkDPair i (There later))
76 | = f (MkDPair i later)
83 | -> (xs : Vect n type)
84 | -> Dec (DPair type (AtIndex idx xs))
86 | = Yes (MkDPair x Here)
88 | index (FS x) (y :: xs) with (Find.index x xs)
89 | index (FS x) (y :: xs) | (Yes (MkDPair i idx))
90 | = Yes (MkDPair i (There idx))
91 | index (FS x) (y :: xs) | (No contra) = No (elemNotInRest contra)