module Weekday ( Weekday(..)
, makeWeekday
, fullWeek
, capitalise
) where
import Data.Char (toLower, toTitle)
import Test.QuickCheck (Arbitrary (arbitrary), arbitraryBoundedEnum)
import Text.Read (readMaybe)
data Weekday = Mon | Tue | Wed | Thu | Fri | Sat | Sun
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
Weekday -> Int
Weekday -> [Weekday]
Weekday -> Weekday
Weekday -> Weekday -> [Weekday]
Weekday -> Weekday -> Weekday -> [Weekday]
(Weekday -> Weekday)
-> (Weekday -> Weekday)
-> (Int -> Weekday)
-> (Weekday -> Int)
-> (Weekday -> [Weekday])
-> (Weekday -> Weekday -> [Weekday])
-> (Weekday -> Weekday -> [Weekday])
-> (Weekday -> Weekday -> Weekday -> [Weekday])
-> Enum Weekday
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: Weekday -> Weekday
succ :: Weekday -> Weekday
$cpred :: Weekday -> Weekday
pred :: Weekday -> Weekday
$ctoEnum :: Int -> Weekday
toEnum :: Int -> Weekday
$cfromEnum :: Weekday -> Int
fromEnum :: Weekday -> Int
$cenumFrom :: Weekday -> [Weekday]
enumFrom :: Weekday -> [Weekday]
$cenumFromThen :: Weekday -> Weekday -> [Weekday]
enumFromThen :: Weekday -> Weekday -> [Weekday]
$cenumFromTo :: Weekday -> Weekday -> [Weekday]
enumFromTo :: Weekday -> Weekday -> [Weekday]
$cenumFromThenTo :: Weekday -> Weekday -> Weekday -> [Weekday]
enumFromThenTo :: Weekday -> Weekday -> Weekday -> [Weekday]
Enum, 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, Weekday
Weekday -> Weekday -> Bounded Weekday
forall a. a -> a -> Bounded a
$cminBound :: Weekday
minBound :: Weekday
$cmaxBound :: Weekday
maxBound :: Weekday
Bounded, ReadPrec [Weekday]
ReadPrec Weekday
Int -> ReadS Weekday
ReadS [Weekday]
(Int -> ReadS Weekday)
-> ReadS [Weekday]
-> ReadPrec Weekday
-> ReadPrec [Weekday]
-> Read Weekday
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS Weekday
readsPrec :: Int -> ReadS Weekday
$creadList :: ReadS [Weekday]
readList :: ReadS [Weekday]
$creadPrec :: ReadPrec Weekday
readPrec :: ReadPrec Weekday
$creadListPrec :: ReadPrec [Weekday]
readListPrec :: ReadPrec [Weekday]
Read)
instance Arbitrary Weekday where
arbitrary :: Gen Weekday
arbitrary = Gen Weekday
forall a. (Bounded a, Enum a) => Gen a
arbitraryBoundedEnum
makeWeekday :: String -> Maybe Weekday
makeWeekday :: String -> Maybe Weekday
makeWeekday = String -> Maybe Weekday
forall a. Read a => String -> Maybe a
readMaybe (String -> Maybe Weekday) -> ShowS -> String -> Maybe Weekday
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ShowS
capitalise ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> ShowS
forall a. Int -> [a] -> [a]
take Int
4
fullWeek :: [Weekday]
fullWeek :: [Weekday]
fullWeek = [Weekday
forall a. Bounded a => a
minBound..Weekday
forall a. Bounded a => a
maxBound]
capitalise :: String -> String
capitalise :: ShowS
capitalise = ((Char -> Char) -> Char -> Char) -> [Char -> Char] -> ShowS
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith (Char -> Char) -> Char -> Char
forall a. a -> a
id (Char -> Char
toTitle (Char -> Char) -> [Char -> Char] -> [Char -> Char]
forall a. a -> [a] -> [a]
: (Char -> Char) -> [Char -> Char]
forall a. a -> [a]
repeat Char -> Char
toLower)