7 | data Path : (t -> t -> Type) -> t -> t -> Type where
9 | (::) : {0 i, j, k : t} ->
10 | g i j -> Path g j k -> Path g i k
13 | joinPath : Path g i j -> Path g j k -> Path g i k
15 | joinPath (e::ij) jk = e :: joinPath ij jk
18 | snocPath : Path g i j -> g j k -> Path g i k
20 | snocPath (e::ij) f = e :: snocPath ij f
23 | lengthPath : Path g i j -> Nat
25 | lengthPath (_::p) = S $
lengthPath p
28 | mapPath : {0 gt : t -> t -> Type} -> {0 gu : u -> u -> Type} -> {0 f : t -> u}
29 | -> ({0 i, j : t} -> gt i j -> gu (f i) (f j))
30 | -> {0 i, j : t} -> Path gt i j -> Path gu (f i) (f j)
32 | mapPath gf (e::p) = gf e :: mapPath gf p
35 | foldPath : {0 gt : t -> t -> Type} -> {0 gu : u -> u -> Type} -> {0 f : t -> u}
36 | -> ({0 i, j, k : t} -> gt i j -> gu (f j) (f k) -> gu (f i) (f k))
37 | -> {0 i, j, k : t} -> Path gt i j -> gu (f j) (f k) -> gu (f i) (f k)
38 | foldPath gf [] jk = jk
39 | foldPath gf (e::ij) jk = gf e (foldPath {gu} gf ij jk)
42 | foldlPath : {0 gt : t -> t -> Type} -> {0 gu : u -> u -> Type} -> {0 f : t -> u}
43 | -> ({0 i, j, k : t} -> gu (f i) (f j) -> gt j k -> gu (f i) (f k))
44 | -> {0 i, j, k : t} -> gu (f i) (f j) -> Path gt j k -> gu (f i) (f k)
45 | foldlPath gf ij [] = ij
46 | foldlPath gf ij (e::jk) = foldlPath {gu} gf (gf ij e) jk