{-# LANGUAGE FlexibleContexts #-}

module Saturn.Unstable.Type.Weekday where

import qualified Data.Coerce as Coerce
import qualified Data.Set as Set
import qualified Data.Text.Lazy.Builder as Builder
import qualified Data.Word as Word
import qualified Saturn.Unstable.Type.Field as Field
import qualified Text.Parsec as Parsec

newtype Weekday
  = Weekday Field.Field
  deriving (Weekday -> Weekday -> Bool
(Weekday -> Weekday -> Bool)
-> (Weekday -> Weekday -> Bool) -> Eq Weekday
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Weekday -> Weekday -> Bool
== :: Weekday -> Weekday -> Bool
$c/= :: Weekday -> Weekday -> Bool
/= :: Weekday -> Weekday -> Bool
Eq, Int -> Weekday -> ShowS
[Weekday] -> ShowS
Weekday -> String
(Int -> Weekday -> ShowS)
-> (Weekday -> String) -> ([Weekday] -> ShowS) -> Show Weekday
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Weekday -> ShowS
showsPrec :: Int -> Weekday -> ShowS
$cshow :: Weekday -> String
show :: Weekday -> String
$cshowList :: [Weekday] -> ShowS
showList :: [Weekday] -> ShowS
Show)

bounds :: (Word.Word8, Word.Word8)
bounds :: (Word8, Word8)
bounds = (Word8
0, Word8
6)

fromField :: Field.Field -> Maybe Weekday
fromField :: Field -> Maybe Weekday
fromField Field
field =
  if (Word8, Word8) -> Field -> Bool
Field.isValid (Word8, Word8)
bounds Field
field then Weekday -> Maybe Weekday
forall a. a -> Maybe a
Just (Weekday -> Maybe Weekday) -> Weekday -> Maybe Weekday
forall a b. (a -> b) -> a -> b
$ Field -> Weekday
Weekday Field
field else Maybe Weekday
forall a. Maybe a
Nothing

toField :: Weekday -> Field.Field
toField :: Weekday -> Field
toField = Weekday -> Field
forall a b. Coercible a b => a -> b
Coerce.coerce

parsec :: (Parsec.Stream s m Char) => Parsec.ParsecT s u m Weekday
parsec :: forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Weekday
parsec = do
  Field
field <- ParsecT s u m Field
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Field
Field.parsec
  ParsecT s u m Weekday
-> (Weekday -> ParsecT s u m Weekday)
-> Maybe Weekday
-> ParsecT s u m Weekday
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (String -> ParsecT s u m Weekday
forall a. String -> ParsecT s u m a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"invalid Weekday") Weekday -> ParsecT s u m Weekday
forall a. a -> ParsecT s u m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe Weekday -> ParsecT s u m Weekday)
-> Maybe Weekday -> ParsecT s u m Weekday
forall a b. (a -> b) -> a -> b
$ Field -> Maybe Weekday
fromField Field
field

toBuilder :: Weekday -> Builder.Builder
toBuilder :: Weekday -> Builder
toBuilder = Field -> Builder
Field.toBuilder (Field -> Builder) -> (Weekday -> Field) -> Weekday -> Builder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Weekday -> Field
toField

expand :: Weekday -> Set.Set Word.Word8
expand :: Weekday -> Set Word8
expand = (Word8, Word8) -> Field -> Set Word8
Field.expand (Word8, Word8)
bounds (Field -> Set Word8) -> (Weekday -> Field) -> Weekday -> Set Word8
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Weekday -> Field
toField

isMatch :: Word.Word8 -> Weekday -> Bool
isMatch :: Word8 -> Weekday -> Bool
isMatch Word8
word8 = Word8 -> Set Word8 -> Bool
forall a. Ord a => a -> Set a -> Bool
Set.member Word8
word8 (Set Word8 -> Bool) -> (Weekday -> Set Word8) -> Weekday -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Weekday -> Set Word8
expand