module Descriptive.Form
(
input
,validate
,Form (..)
)
where
import Descriptive
import Control.Arrow
import Data.Map.Strict (Map)
import qualified Data.Map.Strict as M
import Data.Text (Text)
data Form
= Input !Text
| Constraint !Text
deriving (Show,Eq)
input :: Text -> Consumer (Map Text Text) Form Text
input name =
consumer (d,)
(\s ->
(case M.lookup name s of
Nothing -> Continued d
Just a -> Succeeded a
,s))
where d = Unit (Input name)
validate :: Text
-> (a -> Maybe b)
-> Consumer (Map Text Text) Form a
-> Consumer (Map Text Text) Form b
validate d' check =
wrap (\s d -> redescribe (d s))
(\s d p ->
case p s of
(Failed e,s') -> (Failed e,s')
(Continued e,s') -> (Continued (wrapper e),s')
(Succeeded a,s') ->
case check a of
Nothing ->
(Continued (fst (redescribe (d s))),s')
Just a' -> (Succeeded a',s'))
where redescribe = first wrapper
wrapper = Wrap (Constraint d')