This module defines a variant of applicative validation with an Alt instance, for validators which support errors with multiple alternatives.

#V Source

newtype V err result

The V functor, used for alternative validation

The Alternative instance collects multiple failures in an arbitrary Semiring.

For example:

import Data.Semiring.Free

validate r :: Person -> V (Free Error) Person
validate person = { first: _, last: _, contact: _}
  <$> validateName person.first
  <*> validateName person.last
  <*> (validateEmail <|> validatePhone



#validation Source

validation :: forall err result r. (err -> r) -> (result -> r) -> V err result -> r

Takes two functions an a V value, if the validation failed the error is applied to the first function, if the validation succeeded the inner value is applied to the second function.

#invalid Source

invalid :: forall err result. err -> V err result

Fail with a validation error.

#isValid Source

isValid :: forall err result. V err result -> Boolean

Test whether validation was successful or not.

#toEither Source

toEither :: forall err result. V err result -> Either err result

#andThen Source

andThen :: forall err a b. V err a -> (a -> V err b) -> V err b

Apply a function if successful, to enable chaining of validation.

Similar to a monadic bind, except it is inconsistent with Apply - that is, where as apply (V err a) (V err a) accumulates failures, (V err a) ``andThen`` (\a -> V err a) has fail-fast semantics (>>= would be expected to be consistent).