From 4c4717f9bdbc1c3c69bb85348129185c20aba4e6 Mon Sep 17 00:00:00 2001 From: ilias Date: Wed, 7 Feb 2018 14:32:21 +0100 Subject: [PATCH] Allow reusing validators Some sort of contravariant map would allow reusing validators in different contexts. Alternative names proposed in Slack by norpan and gyzerok: - `comap` - `contraMap` - `select` (i.e. `Validate.select .name nameValidator`) --- src/Validate.elm | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/Validate.elm b/src/Validate.elm index 211abfa..c48ac70 100644 --- a/src/Validate.elm +++ b/src/Validate.elm @@ -16,6 +16,7 @@ module Validate , isBlank , isInt , isValidEmail + , preMap , validate ) @@ -57,6 +58,11 @@ module Validate @docs all, any, firstError +# Reusing validators + +@docs preMap + + # Checking values directly @docs isBlank, isInt, isValidEmail @@ -220,6 +226,33 @@ ifFalse test error = +-- REUSING VALIDATORS -- + + +{-| Reuse a validator in a larger context. + + import Validate exposing (ifBlank, preMap) + + type alias User = + { name : String + } + + nameValidator : Validator String String + nameValidator = + ifBlank identity + "Please enter a name" + + userValidator : Validator String User + userValidator = + preMap .user nameValidator + +-} +preMap : (large -> small) -> Validator error small -> Validator error large +preMap f (Validator validator) = + Validator (f >> validator) + + + -- COMBINING VALIDATORS --