-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Library for checking and normalization of data (e.g. from web forms) -- -- Library for checking and normalization of data (e.g. from web forms). @package data-check @version 0.1.0 -- | This module provides generalized approach to checking and verification -- of data, it's useful, for example, for validation of fields on web -- forms. -- -- Typically, there are a number of transformations and checks you may -- want to perform on a particular type of data, such as text. Thus, it -- makes sense to create all those transformations and checks once and -- then combine them to get more complex validators that may vary on -- per-field basis. -- -- Certainly, if we can normalize and validate, we should normalize -- first. However, if we have many normalizing operations, we need a way -- to specify in which order they should be performed, or result can be -- unpredictable. -- -- To specify order in which transformations are performed, -- normalizer and normalizerM functions take a “priority” -- argument, which is just a Natural number. The bigger the -- number, the later the function will be applied, so the transformation -- with priority 0 will always run first. -- -- This method applies to validators just as well. It's possible to -- create a vocabulary of validators that can be mixed together and the -- result will be always deterministic. -- -- To support more real-world use cases, every check can be performed -- inside of a monad, allowing to query a database for example. -- -- One last thing to note is that every normalizer and every validator -- should have a unique priority number. Normalizers (and validators) -- with the same priority will overwrite each other. This is by design. -- Note that normalizer won't override validator with the same priority -- though, their priority-spaces are separate. module Data.Check -- | Create a normalizing Checker. Every normalizer has a priority — -- the bigger the number, the later the normalizer runs. Every normalizer -- you use should have a unique priority number. normalizer :: Monad m => Natural -> (a -> a) -> Checker m e a -- | The same as normalizer, but allows to perform normalization -- inside of a monad. normalizerM :: Monad m => Natural -> (a -> m a) -> Checker m e a -- | Create a validating Checker. Every validator has a priority — -- the bigger the number, the later the validation step runs. Every -- validator you use should have a unique priority number. validator :: Monad m => Natural -> (a -> Maybe e) -> Checker m e a -- | The same as validator, but allows to perform normalization -- inside of a monad. validatorM :: Monad m => Natural -> (a -> m (Maybe e)) -> Checker m e a -- | Checker m e a is a checker that checks value of type -- a, can perform the check in m monad, returning -- e message when check fails. -- -- Checker is a Semigroup and Monoid — this is how -- you combine different checkers and build more complex ones. data Checker m e a -- | Run a Checker on given value. This is version for cases when -- all transformations and validations are pure. runChecker :: Checker Identity e a -> a -> Either e a -- | Version of runChecker that can run transformations and checks -- in any monad. runCheckerM :: Monad m => Checker m e a -> a -> m (Either e a) instance GHC.Classes.Eq (Data.Check.Normalizer m a) instance GHC.Classes.Ord (Data.Check.Normalizer m a) instance GHC.Classes.Eq (Data.Check.Validator m e a) instance GHC.Classes.Ord (Data.Check.Validator m e a) instance Data.Semigroup.Semigroup (Data.Check.Checker m e a) instance GHC.Base.Monad m => GHC.Base.Monoid (Data.Check.Checker m e a)