module Attoparsec.Time.Validation where

import Attoparsec.Time.Prelude

data Validator a
  = Validator String (a -> Bool)

run :: (Show a) => Validator a -> b -> (String -> b) -> a -> b
run :: forall a b. Show a => Validator a -> b -> (String -> b) -> a -> b
run (Validator String
name a -> Bool
predicate) b
onNoError String -> b
onError a
input =
  if a -> Bool
predicate a
input
    then b
onNoError
    else
      String -> b
onError
        forall a b. (a -> b) -> a -> b
$ String -> ShowS
showString String
"Validator "
        forall a b. (a -> b) -> a -> b
$ forall a. Show a => a -> ShowS
shows String
name
        forall a b. (a -> b) -> a -> b
$ String -> ShowS
showString String
" failed on the following input: "
        forall a b. (a -> b) -> a -> b
$ forall a. Show a => a -> String
show a
input

month :: (Num a, Ord a) => Validator a
month :: forall a. (Num a, Ord a) => Validator a
month =
  forall a. String -> (a -> Bool) -> Validator a
Validator String
"month" (forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 Bool -> Bool -> Bool
(&&) (forall a. Ord a => a -> a -> Bool
>= a
1) (forall a. Ord a => a -> a -> Bool
<= a
12))

monthDay :: (Num a, Ord a) => Validator a
monthDay :: forall a. (Num a, Ord a) => Validator a
monthDay =
  forall a. String -> (a -> Bool) -> Validator a
Validator String
"monthDay" (forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 Bool -> Bool -> Bool
(&&) (forall a. Ord a => a -> a -> Bool
>= a
1) (forall a. Ord a => a -> a -> Bool
<= a
31))

weekDay :: (Num a, Ord a) => Validator a
weekDay :: forall a. (Num a, Ord a) => Validator a
weekDay =
  forall a. String -> (a -> Bool) -> Validator a
Validator String
"weekDay" (forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 Bool -> Bool -> Bool
(&&) (forall a. Ord a => a -> a -> Bool
>= a
1) (forall a. Ord a => a -> a -> Bool
<= a
7))

hour :: (Num a, Ord a) => Validator a
hour :: forall a. (Num a, Ord a) => Validator a
hour =
  forall a. String -> (a -> Bool) -> Validator a
Validator String
"hour" (forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 Bool -> Bool -> Bool
(&&) (forall a. Ord a => a -> a -> Bool
>= a
0) (forall a. Ord a => a -> a -> Bool
< a
24))

minute :: (Num a, Ord a) => Validator a
minute :: forall a. (Num a, Ord a) => Validator a
minute =
  forall a. String -> (a -> Bool) -> Validator a
Validator String
"minute" (forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 Bool -> Bool -> Bool
(&&) (forall a. Ord a => a -> a -> Bool
>= a
0) (forall a. Ord a => a -> a -> Bool
< a
60))

second :: (Num a, Ord a) => Validator a
second :: forall a. (Num a, Ord a) => Validator a
second =
  forall a. String -> (a -> Bool) -> Validator a
Validator String
"second" (forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 Bool -> Bool -> Bool
(&&) (forall a. Ord a => a -> a -> Bool
>= a
0) (forall a. Ord a => a -> a -> Bool
< a
60))