0 | module Data.List.Suffix.Result
2 | import Data.Bool.Rewrite
3 | import public Data.List.Suffix
43 | -> {auto p : Suffix b xs ts}
44 | -> Result b t ts e a
49 | -> {ts,stopStart : List t}
50 | -> (start : Suffix False stopStart ts)
51 | -> (0 errEnd : List t)
52 | -> {auto end : Suffix False errEnd stopStart}
54 | -> Result b t ts e a
58 | public export %inline
66 | -> Result b t ts e a
67 | succ val _ = Succ val xs
70 | Functor (Result b t ts e) where
71 | map f (Succ v xs) = Succ (f v) xs
72 | map _ (Fail st ee r) = Fail st ee r
78 | public export %inline
79 | swapOr : {0 x,y : _} -> Result (x || y) t ts e a -> Result (y || x) t ts e a
80 | swapOr = swapOr (\k => Result k t ts e a)
82 | public export %inline
83 | orSame : {0 x : _} -> Result (x || x) t ts e a -> Result x t ts e a
84 | orSame = orSame (\k => Result k t ts e a)
86 | public export %inline
87 | orTrue : {0 x : _} -> Result (x || True) t ts e a -> Result True t ts e a
88 | orTrue = orTrue (\k => Result k t ts e a)
90 | public export %inline
91 | orFalse : {0 x : _} -> Result (x || False) t ts e a -> Result x t ts e a
92 | orFalse = orFalse (\k => Result k t ts e a)
94 | public export %inline
95 | swapAnd : {0 x,y : _} -> Result (x && y) t ts e a -> Result (y && x) t ts e a
96 | swapAnd = swapAnd (\k => Result k t ts e a)
98 | public export %inline
99 | andSame : {0 x : _} -> Result (x && x) t ts e a -> Result x t ts e a
100 | andSame = andSame (\k => Result k t ts e a)
102 | public export %inline
103 | andTrue : {0 x : _} -> Result (x && True) t ts e a -> Result x t ts e a
104 | andTrue = andTrue (\k => Result k t ts e a)
106 | public export %inline
107 | andFalse : {0 x : _} -> Result (x && False) t ts e a -> Result False t ts e a
108 | andFalse = andFalse (\k => Result k t ts e a)
110 | public export %inline
111 | weaken : {0 x : _} -> Result x t ts e a -> Result False t ts e a
112 | weaken (Succ val xs @{p}) = Succ val xs @{weaken p}
113 | weaken (Fail x y err) = Fail x y err
115 | public export %inline
116 | weakens : {0 x : _} -> Result True t ts e a -> Result x t ts e a
117 | weakens (Succ val xs @{p}) = Succ val xs @{weakens p}
118 | weakens (Fail x y err) = Fail x y err
120 | public export %inline
121 | and1 : {0 x : _} -> Result x t ts e a -> Result (x && y) t ts e a
122 | and1 (Succ val xs @{p}) = Succ val xs @{and1 p}
123 | and1 (Fail x y err) = Fail x y err
125 | public export %inline
126 | and2 : {0 x : _} -> Result x t ts e a -> Result (y && x) t ts e a
127 | and2 r = swapAnd $
and1 r
129 | public export %inline
132 | -> Result b1 t xs e a
134 | -> Result (b1 || b2) t ys e a
135 | trans (Succ val ts @{p}) q = Succ val ts @{trans p q}
136 | trans (Fail {stopStart} x y err) q =
137 | Fail {stopStart} (weaken $
trans x q) y err
139 | public export %inline
142 | -> Result b1 t xs e a
143 | -> {auto p : Suffix True xs ys}
144 | -> Result True t ys e a
145 | succT r = swapOr $
trans r p
147 | public export %inline
150 | -> Result b1 t xs e a
151 | -> {auto p : Suffix True xs ys}
152 | -> Result False t ys e a
153 | succF r = weaken $
trans r p