0 | module Data.Validated
2 | import Control.Function
6 | import Decidable.Equality
12 | data Validated e a = Valid a | Invalid e
17 | (Eq e, Eq a) => Eq (Validated e a) where
18 | Valid x == Valid y = x == y
19 | Invalid e == Invalid f = e == f
23 | (Show e, Show a) => Show (Validated e a) where
24 | showPrec d $
Valid x = showCon d "Valid" $
showArg x
25 | showPrec d $
Invalid e = showCon d "Invalid" $
showArg e
28 | Injective Valid where
29 | injective Refl = Refl
32 | Injective Invalid where
33 | injective Refl = Refl
36 | Functor (Validated e) where
37 | map f $
Valid x = Valid $
f x
38 | map _ $
Invalid e = Invalid e
41 | Bifunctor Validated where
42 | bimap _ s $
Valid x = Valid $
s x
43 | bimap f _ $
Invalid e = Invalid $
f e
46 | Bifoldable Validated where
47 | bifoldr _ g acc (Valid a) = g a acc
48 | bifoldr f _ acc (Invalid e) = f e acc
50 | bifoldl _ g acc (Valid a) = g acc a
51 | bifoldl f _ acc (Invalid e) = f acc e
56 | Bitraversable Validated where
57 | bitraverse _ g (Valid a) = Valid <$> g a
58 | bitraverse f _ (Invalid e) = Invalid <$> f e
62 | Semigroup e => Applicative (Validated e) where
65 | Valid f <*> Valid x = Valid $
f x
66 | Invalid e1 <*> Invalid e2 = Invalid $
e1 <+> e2
67 | Invalid e <*> Valid _ = Invalid e
68 | Valid _ <*> Invalid e = Invalid e
75 | Semigroup e => Semigroup (Validated e a) where
76 | l@(Valid _) <+> _ = l
77 | _ <+> r@(Valid _) = r
78 | Invalid e1 <+> Invalid e2 = Invalid $
e1 <+> e2
81 | Monoid e => Monoid (Validated e a) where
82 | neutral = Invalid neutral
87 | Monoid e => Alternative (Validated e) where
89 | l@(Valid _) <|> _ = l
90 | _ <|> r@(Valid _) = r
91 | Invalid e1 <|> Invalid e2 = Invalid $
e1 <+> e2
94 | Foldable (Validated e) where
95 | foldr op init $
Valid x = x `op` init
96 | foldr _ init $
Invalid _ = init
98 | foldl op init $
Valid x = init `op` x
99 | foldl _ init $
Invalid _ = init
101 | null $
Valid _ = False
102 | null $
Invalid _ = True
105 | Traversable (Validated e) where
106 | traverse f $
Valid x = Valid <$> f x
107 | traverse _ $
Invalid e = pure $
Invalid e
110 | Semigroup e => Zippable (Validated e) where
111 | zipWith f (Valid l) (Valid r) = Valid $
f l r
112 | zipWith _ (Valid _) (Invalid r) = Invalid r
113 | zipWith _ (Invalid l) (Valid _) = Invalid l
114 | zipWith _ (Invalid l) (Invalid r) = Invalid $
l <+> r
116 | zipWith3 f (Valid x) (Valid y) (Valid z) = Valid $
f x y z
117 | zipWith3 _ (Valid _) (Valid _) (Invalid z) = Invalid z
118 | zipWith3 _ (Valid _) (Invalid y) (Valid _) = Invalid y
119 | zipWith3 _ (Valid _) (Invalid y) (Invalid z) = Invalid $
y <+> z
120 | zipWith3 _ (Invalid x) (Valid _) (Valid _) = Invalid x
121 | zipWith3 _ (Invalid x) (Valid _) (Invalid z) = Invalid $
x <+> z
122 | zipWith3 _ (Invalid x) (Invalid y) (Valid _) = Invalid $
x <+> y
123 | zipWith3 _ (Invalid x) (Invalid y) (Invalid z) = Invalid $
x <+> y <+> z
125 | unzipWith f (Valid x) = let (a, b) = f x in (Valid a, Valid b)
126 | unzipWith _ (Invalid e) = (Invalid e, Invalid e)
128 | unzipWith3 f (Valid x) = let (a, b, c) = f x in (Valid a, Valid b, Valid c)
129 | unzipWith3 _ (Invalid e) = (Invalid e, Invalid e, Invalid e)
132 | Uninhabited (Valid x = Invalid e) where
133 | uninhabited Refl
impossible
136 | Uninhabited (Invalid e = Valid x) where
137 | uninhabited Refl
impossible
140 | (DecEq e, DecEq a) => DecEq (Validated e a) where
141 | decEq (Valid x) (Valid y) = decEqCong $
decEq x y
142 | decEq (Invalid x) (Invalid y) = decEqCong $
decEq x y
143 | decEq (Valid x) (Invalid y) = No uninhabited
144 | decEq (Invalid x) (Valid y) = No uninhabited
149 | public export %inline
150 | ValidatedL : Type -> Type -> Type
151 | ValidatedL = Validated . List1
153 | public export %inline
154 | oneInvalid : Applicative f => e -> Validated (f e) a
155 | oneInvalid = Invalid . pure
159 | public export %inline
160 | fromEither : Either e a -> Validated e a
161 | fromEither $
Right x = Valid x
162 | fromEither $
Left e = Invalid e
164 | public export %inline
165 | fromEitherL : Either e a -> ValidatedL e a
166 | fromEitherL $
Right x = Valid x
167 | fromEitherL $
Left e = oneInvalid e
169 | public export %inline
170 | toEither : Validated e a -> Either e a
171 | toEither $
Valid x = Right x
172 | toEither $
Invalid e = Left e
176 | public export %inline
177 | fromMaybe : Monoid e => Maybe a -> Validated e a
178 | fromMaybe $
Just x = Valid x
179 | fromMaybe $
Nothing = empty
181 | public export %inline
182 | toMaybe : Validated e a -> Maybe a
183 | toMaybe $
Valid x = Just x
184 | toMaybe $
Invalid _ = Nothing
189 | data IsValid : Validated e a -> Type where
190 | ItIsValid : IsValid $
Valid x
193 | Uninhabited (IsValid $
Invalid e) where
194 | uninhabited ItIsValid
impossible
197 | isItValid : (v : Validated e a) -> Dec (IsValid v)
198 | isItValid $
Valid _ = Yes ItIsValid
199 | isItValid $
Invalid _ = No absurd