{-# LANGUAGE CPP, DeriveFunctor, DeriveFoldable, RankNTypes, Safe #-}
module Text.Numerals.Class (
NumToWord(toCardinal, toOrdinal, toShortOrdinal, toWords, toTimeText, toTimeText')
, ValueSplit(valueSplit)
, NumberType(Cardinal, Ordinal, ShortOrdinal)
, NumberSegment(NumberSegment, segmentDivision, segmentValue, segmentText, segmentRemainder)
, MNumberSegment
, ClockSegment(OClock, Past, QuarterPast, ToHalf, Half, PastHalf, QuarterTo, To)
, DayPart(Night, Morning, Afternoon, Evening)
, DaySegment(DaySegment, dayPart, dayHour)
, toDayPart, toDaySegment, toClockSegment
, hourCorrection
, currentTimeText, currentTimeText'
, NumberToWords, FreeNumberToWords
, MergerFunction, FreeMergerFunction, ValueSplitter, FreeValueSplitter, NumberSegmenting
, ClockText
) where
import Data.Default(Default(def))
#if __GLASGOW_HASKELL__ < 803
import Data.Semigroup((<>))
#endif
import Data.Text(Text)
import Data.Time.Clock(getCurrentTime, utctDayTime)
import Data.Time.LocalTime(TimeOfDay(TimeOfDay), TimeZone, timeToTimeOfDay, utcToLocalTimeOfDay)
import Test.QuickCheck(choose)
import Test.QuickCheck.Arbitrary(Arbitrary(arbitrary, shrink), Arbitrary1(liftArbitrary), arbitrary1, arbitraryBoundedEnum)
import Text.Numerals.Internal(_genText, _shrinkText)
type NumberToWords i = i -> Text
type FreeNumberToWords = forall i . Integral i => NumberToWords i
type MergerFunction i = i -> i -> Text -> Text -> Text
type FreeMergerFunction = forall i . Integral i => MergerFunction i
type ValueSplitter i = i -> Maybe (i, Text)
type FreeValueSplitter = forall i . Integral i => ValueSplitter i
type NumberSegmenting i = i -> NumberSegment i
data NumberSegment i = NumberSegment {
NumberSegment i -> MNumberSegment i
segmentDivision :: MNumberSegment i
, NumberSegment i -> i
segmentValue :: i
, NumberSegment i -> Text
segmentText :: Text
, NumberSegment i -> MNumberSegment i
segmentRemainder :: MNumberSegment i
} deriving (NumberSegment a -> Bool
(a -> m) -> NumberSegment a -> m
(a -> b -> b) -> b -> NumberSegment a -> b
(forall m. Monoid m => NumberSegment m -> m)
-> (forall m a. Monoid m => (a -> m) -> NumberSegment a -> m)
-> (forall m a. Monoid m => (a -> m) -> NumberSegment a -> m)
-> (forall a b. (a -> b -> b) -> b -> NumberSegment a -> b)
-> (forall a b. (a -> b -> b) -> b -> NumberSegment a -> b)
-> (forall b a. (b -> a -> b) -> b -> NumberSegment a -> b)
-> (forall b a. (b -> a -> b) -> b -> NumberSegment a -> b)
-> (forall a. (a -> a -> a) -> NumberSegment a -> a)
-> (forall a. (a -> a -> a) -> NumberSegment a -> a)
-> (forall a. NumberSegment a -> [a])
-> (forall a. NumberSegment a -> Bool)
-> (forall a. NumberSegment a -> Int)
-> (forall a. Eq a => a -> NumberSegment a -> Bool)
-> (forall a. Ord a => NumberSegment a -> a)
-> (forall a. Ord a => NumberSegment a -> a)
-> (forall a. Num a => NumberSegment a -> a)
-> (forall a. Num a => NumberSegment a -> a)
-> Foldable NumberSegment
forall a. Eq a => a -> NumberSegment a -> Bool
forall a. Num a => NumberSegment a -> a
forall a. Ord a => NumberSegment a -> a
forall m. Monoid m => NumberSegment m -> m
forall a. NumberSegment a -> Bool
forall a. NumberSegment a -> Int
forall a. NumberSegment a -> [a]
forall a. (a -> a -> a) -> NumberSegment a -> a
forall m a. Monoid m => (a -> m) -> NumberSegment a -> m
forall b a. (b -> a -> b) -> b -> NumberSegment a -> b
forall a b. (a -> b -> b) -> b -> NumberSegment a -> b
forall (t :: * -> *).
(forall m. Monoid m => t m -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. t a -> [a])
-> (forall a. t a -> Bool)
-> (forall a. t a -> Int)
-> (forall a. Eq a => a -> t a -> Bool)
-> (forall a. Ord a => t a -> a)
-> (forall a. Ord a => t a -> a)
-> (forall a. Num a => t a -> a)
-> (forall a. Num a => t a -> a)
-> Foldable t
product :: NumberSegment a -> a
$cproduct :: forall a. Num a => NumberSegment a -> a
sum :: NumberSegment a -> a
$csum :: forall a. Num a => NumberSegment a -> a
minimum :: NumberSegment a -> a
$cminimum :: forall a. Ord a => NumberSegment a -> a
maximum :: NumberSegment a -> a
$cmaximum :: forall a. Ord a => NumberSegment a -> a
elem :: a -> NumberSegment a -> Bool
$celem :: forall a. Eq a => a -> NumberSegment a -> Bool
length :: NumberSegment a -> Int
$clength :: forall a. NumberSegment a -> Int
null :: NumberSegment a -> Bool
$cnull :: forall a. NumberSegment a -> Bool
toList :: NumberSegment a -> [a]
$ctoList :: forall a. NumberSegment a -> [a]
foldl1 :: (a -> a -> a) -> NumberSegment a -> a
$cfoldl1 :: forall a. (a -> a -> a) -> NumberSegment a -> a
foldr1 :: (a -> a -> a) -> NumberSegment a -> a
$cfoldr1 :: forall a. (a -> a -> a) -> NumberSegment a -> a
foldl' :: (b -> a -> b) -> b -> NumberSegment a -> b
$cfoldl' :: forall b a. (b -> a -> b) -> b -> NumberSegment a -> b
foldl :: (b -> a -> b) -> b -> NumberSegment a -> b
$cfoldl :: forall b a. (b -> a -> b) -> b -> NumberSegment a -> b
foldr' :: (a -> b -> b) -> b -> NumberSegment a -> b
$cfoldr' :: forall a b. (a -> b -> b) -> b -> NumberSegment a -> b
foldr :: (a -> b -> b) -> b -> NumberSegment a -> b
$cfoldr :: forall a b. (a -> b -> b) -> b -> NumberSegment a -> b
foldMap' :: (a -> m) -> NumberSegment a -> m
$cfoldMap' :: forall m a. Monoid m => (a -> m) -> NumberSegment a -> m
foldMap :: (a -> m) -> NumberSegment a -> m
$cfoldMap :: forall m a. Monoid m => (a -> m) -> NumberSegment a -> m
fold :: NumberSegment m -> m
$cfold :: forall m. Monoid m => NumberSegment m -> m
Foldable, a -> NumberSegment b -> NumberSegment a
(a -> b) -> NumberSegment a -> NumberSegment b
(forall a b. (a -> b) -> NumberSegment a -> NumberSegment b)
-> (forall a b. a -> NumberSegment b -> NumberSegment a)
-> Functor NumberSegment
forall a b. a -> NumberSegment b -> NumberSegment a
forall a b. (a -> b) -> NumberSegment a -> NumberSegment b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> NumberSegment b -> NumberSegment a
$c<$ :: forall a b. a -> NumberSegment b -> NumberSegment a
fmap :: (a -> b) -> NumberSegment a -> NumberSegment b
$cfmap :: forall a b. (a -> b) -> NumberSegment a -> NumberSegment b
Functor, NumberSegment i -> NumberSegment i -> Bool
(NumberSegment i -> NumberSegment i -> Bool)
-> (NumberSegment i -> NumberSegment i -> Bool)
-> Eq (NumberSegment i)
forall i. Eq i => NumberSegment i -> NumberSegment i -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: NumberSegment i -> NumberSegment i -> Bool
$c/= :: forall i. Eq i => NumberSegment i -> NumberSegment i -> Bool
== :: NumberSegment i -> NumberSegment i -> Bool
$c== :: forall i. Eq i => NumberSegment i -> NumberSegment i -> Bool
Eq, Eq (NumberSegment i)
Eq (NumberSegment i)
-> (NumberSegment i -> NumberSegment i -> Ordering)
-> (NumberSegment i -> NumberSegment i -> Bool)
-> (NumberSegment i -> NumberSegment i -> Bool)
-> (NumberSegment i -> NumberSegment i -> Bool)
-> (NumberSegment i -> NumberSegment i -> Bool)
-> (NumberSegment i -> NumberSegment i -> NumberSegment i)
-> (NumberSegment i -> NumberSegment i -> NumberSegment i)
-> Ord (NumberSegment i)
NumberSegment i -> NumberSegment i -> Bool
NumberSegment i -> NumberSegment i -> Ordering
NumberSegment i -> NumberSegment i -> NumberSegment i
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall i. Ord i => Eq (NumberSegment i)
forall i. Ord i => NumberSegment i -> NumberSegment i -> Bool
forall i. Ord i => NumberSegment i -> NumberSegment i -> Ordering
forall i.
Ord i =>
NumberSegment i -> NumberSegment i -> NumberSegment i
min :: NumberSegment i -> NumberSegment i -> NumberSegment i
$cmin :: forall i.
Ord i =>
NumberSegment i -> NumberSegment i -> NumberSegment i
max :: NumberSegment i -> NumberSegment i -> NumberSegment i
$cmax :: forall i.
Ord i =>
NumberSegment i -> NumberSegment i -> NumberSegment i
>= :: NumberSegment i -> NumberSegment i -> Bool
$c>= :: forall i. Ord i => NumberSegment i -> NumberSegment i -> Bool
> :: NumberSegment i -> NumberSegment i -> Bool
$c> :: forall i. Ord i => NumberSegment i -> NumberSegment i -> Bool
<= :: NumberSegment i -> NumberSegment i -> Bool
$c<= :: forall i. Ord i => NumberSegment i -> NumberSegment i -> Bool
< :: NumberSegment i -> NumberSegment i -> Bool
$c< :: forall i. Ord i => NumberSegment i -> NumberSegment i -> Bool
compare :: NumberSegment i -> NumberSegment i -> Ordering
$ccompare :: forall i. Ord i => NumberSegment i -> NumberSegment i -> Ordering
$cp1Ord :: forall i. Ord i => Eq (NumberSegment i)
Ord, ReadPrec [NumberSegment i]
ReadPrec (NumberSegment i)
Int -> ReadS (NumberSegment i)
ReadS [NumberSegment i]
(Int -> ReadS (NumberSegment i))
-> ReadS [NumberSegment i]
-> ReadPrec (NumberSegment i)
-> ReadPrec [NumberSegment i]
-> Read (NumberSegment i)
forall i. Read i => ReadPrec [NumberSegment i]
forall i. Read i => ReadPrec (NumberSegment i)
forall i. Read i => Int -> ReadS (NumberSegment i)
forall i. Read i => ReadS [NumberSegment i]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [NumberSegment i]
$creadListPrec :: forall i. Read i => ReadPrec [NumberSegment i]
readPrec :: ReadPrec (NumberSegment i)
$creadPrec :: forall i. Read i => ReadPrec (NumberSegment i)
readList :: ReadS [NumberSegment i]
$creadList :: forall i. Read i => ReadS [NumberSegment i]
readsPrec :: Int -> ReadS (NumberSegment i)
$creadsPrec :: forall i. Read i => Int -> ReadS (NumberSegment i)
Read, Int -> NumberSegment i -> ShowS
[NumberSegment i] -> ShowS
NumberSegment i -> String
(Int -> NumberSegment i -> ShowS)
-> (NumberSegment i -> String)
-> ([NumberSegment i] -> ShowS)
-> Show (NumberSegment i)
forall i. Show i => Int -> NumberSegment i -> ShowS
forall i. Show i => [NumberSegment i] -> ShowS
forall i. Show i => NumberSegment i -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [NumberSegment i] -> ShowS
$cshowList :: forall i. Show i => [NumberSegment i] -> ShowS
show :: NumberSegment i -> String
$cshow :: forall i. Show i => NumberSegment i -> String
showsPrec :: Int -> NumberSegment i -> ShowS
$cshowsPrec :: forall i. Show i => Int -> NumberSegment i -> ShowS
Show)
instance Arbitrary1 NumberSegment where
liftArbitrary :: Gen a -> Gen (NumberSegment a)
liftArbitrary Gen a
gen = Gen (NumberSegment a)
go
where go :: Gen (NumberSegment a)
go = MNumberSegment a
-> a -> Text -> MNumberSegment a -> NumberSegment a
forall i.
MNumberSegment i
-> i -> Text -> MNumberSegment i -> NumberSegment i
NumberSegment (MNumberSegment a
-> a -> Text -> MNumberSegment a -> NumberSegment a)
-> Gen (MNumberSegment a)
-> Gen (a -> Text -> MNumberSegment a -> NumberSegment a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen (NumberSegment a) -> Gen (MNumberSegment a)
forall (f :: * -> *) a. Arbitrary1 f => Gen a -> Gen (f a)
liftArbitrary Gen (NumberSegment a)
go Gen (a -> Text -> MNumberSegment a -> NumberSegment a)
-> Gen a -> Gen (Text -> MNumberSegment a -> NumberSegment a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen a
gen Gen (Text -> MNumberSegment a -> NumberSegment a)
-> Gen Text -> Gen (MNumberSegment a -> NumberSegment a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen Text
_genText Gen (MNumberSegment a -> NumberSegment a)
-> Gen (MNumberSegment a) -> Gen (NumberSegment a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen (NumberSegment a) -> Gen (MNumberSegment a)
forall (f :: * -> *) a. Arbitrary1 f => Gen a -> Gen (f a)
liftArbitrary Gen (NumberSegment a)
go
instance Arbitrary i => Arbitrary (NumberSegment i) where
arbitrary :: Gen (NumberSegment i)
arbitrary = Gen (NumberSegment i)
forall (f :: * -> *) a. (Arbitrary1 f, Arbitrary a) => Gen (f a)
arbitrary1
shrink :: NumberSegment i -> [NumberSegment i]
shrink (NumberSegment MNumberSegment i
dv i
val Text
txt MNumberSegment i
rm) =
((\MNumberSegment i
x -> MNumberSegment i
-> i -> Text -> MNumberSegment i -> NumberSegment i
forall i.
MNumberSegment i
-> i -> Text -> MNumberSegment i -> NumberSegment i
NumberSegment MNumberSegment i
x i
val Text
txt MNumberSegment i
rm) (MNumberSegment i -> NumberSegment i)
-> [MNumberSegment i] -> [NumberSegment i]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> MNumberSegment i -> [MNumberSegment i]
forall a. Arbitrary a => a -> [a]
shrink MNumberSegment i
dv) [NumberSegment i] -> [NumberSegment i] -> [NumberSegment i]
forall a. Semigroup a => a -> a -> a
<>
((\i
x -> MNumberSegment i
-> i -> Text -> MNumberSegment i -> NumberSegment i
forall i.
MNumberSegment i
-> i -> Text -> MNumberSegment i -> NumberSegment i
NumberSegment MNumberSegment i
dv i
x Text
txt MNumberSegment i
rm) (i -> NumberSegment i) -> [i] -> [NumberSegment i]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> i -> [i]
forall a. Arbitrary a => a -> [a]
shrink i
val) [NumberSegment i] -> [NumberSegment i] -> [NumberSegment i]
forall a. Semigroup a => a -> a -> a
<>
((\Text
x -> MNumberSegment i
-> i -> Text -> MNumberSegment i -> NumberSegment i
forall i.
MNumberSegment i
-> i -> Text -> MNumberSegment i -> NumberSegment i
NumberSegment MNumberSegment i
dv i
val Text
x MNumberSegment i
rm) (Text -> NumberSegment i) -> [Text] -> [NumberSegment i]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Text -> [Text]
_shrinkText Text
txt) [NumberSegment i] -> [NumberSegment i] -> [NumberSegment i]
forall a. Semigroup a => a -> a -> a
<>
(MNumberSegment i
-> i -> Text -> MNumberSegment i -> NumberSegment i
forall i.
MNumberSegment i
-> i -> Text -> MNumberSegment i -> NumberSegment i
NumberSegment MNumberSegment i
dv i
val Text
txt (MNumberSegment i -> NumberSegment i)
-> [MNumberSegment i] -> [NumberSegment i]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> MNumberSegment i -> [MNumberSegment i]
forall a. Arbitrary a => a -> [a]
shrink MNumberSegment i
rm)
type MNumberSegment i = Maybe (NumberSegment i)
data NumberType
= Cardinal
| Ordinal
| ShortOrdinal
deriving (NumberType
NumberType -> NumberType -> Bounded NumberType
forall a. a -> a -> Bounded a
maxBound :: NumberType
$cmaxBound :: NumberType
minBound :: NumberType
$cminBound :: NumberType
Bounded, Int -> NumberType
NumberType -> Int
NumberType -> [NumberType]
NumberType -> NumberType
NumberType -> NumberType -> [NumberType]
NumberType -> NumberType -> NumberType -> [NumberType]
(NumberType -> NumberType)
-> (NumberType -> NumberType)
-> (Int -> NumberType)
-> (NumberType -> Int)
-> (NumberType -> [NumberType])
-> (NumberType -> NumberType -> [NumberType])
-> (NumberType -> NumberType -> [NumberType])
-> (NumberType -> NumberType -> NumberType -> [NumberType])
-> Enum NumberType
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: NumberType -> NumberType -> NumberType -> [NumberType]
$cenumFromThenTo :: NumberType -> NumberType -> NumberType -> [NumberType]
enumFromTo :: NumberType -> NumberType -> [NumberType]
$cenumFromTo :: NumberType -> NumberType -> [NumberType]
enumFromThen :: NumberType -> NumberType -> [NumberType]
$cenumFromThen :: NumberType -> NumberType -> [NumberType]
enumFrom :: NumberType -> [NumberType]
$cenumFrom :: NumberType -> [NumberType]
fromEnum :: NumberType -> Int
$cfromEnum :: NumberType -> Int
toEnum :: Int -> NumberType
$ctoEnum :: Int -> NumberType
pred :: NumberType -> NumberType
$cpred :: NumberType -> NumberType
succ :: NumberType -> NumberType
$csucc :: NumberType -> NumberType
Enum, NumberType -> NumberType -> Bool
(NumberType -> NumberType -> Bool)
-> (NumberType -> NumberType -> Bool) -> Eq NumberType
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: NumberType -> NumberType -> Bool
$c/= :: NumberType -> NumberType -> Bool
== :: NumberType -> NumberType -> Bool
$c== :: NumberType -> NumberType -> Bool
Eq, Eq NumberType
Eq NumberType
-> (NumberType -> NumberType -> Ordering)
-> (NumberType -> NumberType -> Bool)
-> (NumberType -> NumberType -> Bool)
-> (NumberType -> NumberType -> Bool)
-> (NumberType -> NumberType -> Bool)
-> (NumberType -> NumberType -> NumberType)
-> (NumberType -> NumberType -> NumberType)
-> Ord NumberType
NumberType -> NumberType -> Bool
NumberType -> NumberType -> Ordering
NumberType -> NumberType -> NumberType
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: NumberType -> NumberType -> NumberType
$cmin :: NumberType -> NumberType -> NumberType
max :: NumberType -> NumberType -> NumberType
$cmax :: NumberType -> NumberType -> NumberType
>= :: NumberType -> NumberType -> Bool
$c>= :: NumberType -> NumberType -> Bool
> :: NumberType -> NumberType -> Bool
$c> :: NumberType -> NumberType -> Bool
<= :: NumberType -> NumberType -> Bool
$c<= :: NumberType -> NumberType -> Bool
< :: NumberType -> NumberType -> Bool
$c< :: NumberType -> NumberType -> Bool
compare :: NumberType -> NumberType -> Ordering
$ccompare :: NumberType -> NumberType -> Ordering
$cp1Ord :: Eq NumberType
Ord, ReadPrec [NumberType]
ReadPrec NumberType
Int -> ReadS NumberType
ReadS [NumberType]
(Int -> ReadS NumberType)
-> ReadS [NumberType]
-> ReadPrec NumberType
-> ReadPrec [NumberType]
-> Read NumberType
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [NumberType]
$creadListPrec :: ReadPrec [NumberType]
readPrec :: ReadPrec NumberType
$creadPrec :: ReadPrec NumberType
readList :: ReadS [NumberType]
$creadList :: ReadS [NumberType]
readsPrec :: Int -> ReadS NumberType
$creadsPrec :: Int -> ReadS NumberType
Read, Int -> NumberType -> ShowS
[NumberType] -> ShowS
NumberType -> String
(Int -> NumberType -> ShowS)
-> (NumberType -> String)
-> ([NumberType] -> ShowS)
-> Show NumberType
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [NumberType] -> ShowS
$cshowList :: [NumberType] -> ShowS
show :: NumberType -> String
$cshow :: NumberType -> String
showsPrec :: Int -> NumberType -> ShowS
$cshowsPrec :: Int -> NumberType -> ShowS
Show)
instance Arbitrary NumberType where
arbitrary :: Gen NumberType
arbitrary = Gen NumberType
forall a. (Bounded a, Enum a) => Gen a
arbitraryBoundedEnum
type ClockText
= ClockSegment
-> DaySegment
-> Int
-> Int
-> Text
data ClockSegment
= OClock
| Past Int
| QuarterPast
| ToHalf Int
| Half
| PastHalf Int
| QuarterTo
| To Int
deriving (ClockSegment -> ClockSegment -> Bool
(ClockSegment -> ClockSegment -> Bool)
-> (ClockSegment -> ClockSegment -> Bool) -> Eq ClockSegment
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ClockSegment -> ClockSegment -> Bool
$c/= :: ClockSegment -> ClockSegment -> Bool
== :: ClockSegment -> ClockSegment -> Bool
$c== :: ClockSegment -> ClockSegment -> Bool
Eq, Eq ClockSegment
Eq ClockSegment
-> (ClockSegment -> ClockSegment -> Ordering)
-> (ClockSegment -> ClockSegment -> Bool)
-> (ClockSegment -> ClockSegment -> Bool)
-> (ClockSegment -> ClockSegment -> Bool)
-> (ClockSegment -> ClockSegment -> Bool)
-> (ClockSegment -> ClockSegment -> ClockSegment)
-> (ClockSegment -> ClockSegment -> ClockSegment)
-> Ord ClockSegment
ClockSegment -> ClockSegment -> Bool
ClockSegment -> ClockSegment -> Ordering
ClockSegment -> ClockSegment -> ClockSegment
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: ClockSegment -> ClockSegment -> ClockSegment
$cmin :: ClockSegment -> ClockSegment -> ClockSegment
max :: ClockSegment -> ClockSegment -> ClockSegment
$cmax :: ClockSegment -> ClockSegment -> ClockSegment
>= :: ClockSegment -> ClockSegment -> Bool
$c>= :: ClockSegment -> ClockSegment -> Bool
> :: ClockSegment -> ClockSegment -> Bool
$c> :: ClockSegment -> ClockSegment -> Bool
<= :: ClockSegment -> ClockSegment -> Bool
$c<= :: ClockSegment -> ClockSegment -> Bool
< :: ClockSegment -> ClockSegment -> Bool
$c< :: ClockSegment -> ClockSegment -> Bool
compare :: ClockSegment -> ClockSegment -> Ordering
$ccompare :: ClockSegment -> ClockSegment -> Ordering
$cp1Ord :: Eq ClockSegment
Ord, ReadPrec [ClockSegment]
ReadPrec ClockSegment
Int -> ReadS ClockSegment
ReadS [ClockSegment]
(Int -> ReadS ClockSegment)
-> ReadS [ClockSegment]
-> ReadPrec ClockSegment
-> ReadPrec [ClockSegment]
-> Read ClockSegment
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [ClockSegment]
$creadListPrec :: ReadPrec [ClockSegment]
readPrec :: ReadPrec ClockSegment
$creadPrec :: ReadPrec ClockSegment
readList :: ReadS [ClockSegment]
$creadList :: ReadS [ClockSegment]
readsPrec :: Int -> ReadS ClockSegment
$creadsPrec :: Int -> ReadS ClockSegment
Read, Int -> ClockSegment -> ShowS
[ClockSegment] -> ShowS
ClockSegment -> String
(Int -> ClockSegment -> ShowS)
-> (ClockSegment -> String)
-> ([ClockSegment] -> ShowS)
-> Show ClockSegment
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ClockSegment] -> ShowS
$cshowList :: [ClockSegment] -> ShowS
show :: ClockSegment -> String
$cshow :: ClockSegment -> String
showsPrec :: Int -> ClockSegment -> ShowS
$cshowsPrec :: Int -> ClockSegment -> ShowS
Show)
instance Arbitrary ClockSegment where
arbitrary :: Gen ClockSegment
arbitrary = Int -> ClockSegment
toClockSegment (Int -> ClockSegment) -> Gen Int -> Gen ClockSegment
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Int, Int) -> Gen Int
forall a. Random a => (a, a) -> Gen a
choose (Int
0, Int
59)
data DayPart
= Night
| Morning
| Afternoon
| Evening
deriving (DayPart
DayPart -> DayPart -> Bounded DayPart
forall a. a -> a -> Bounded a
maxBound :: DayPart
$cmaxBound :: DayPart
minBound :: DayPart
$cminBound :: DayPart
Bounded, Int -> DayPart
DayPart -> Int
DayPart -> [DayPart]
DayPart -> DayPart
DayPart -> DayPart -> [DayPart]
DayPart -> DayPart -> DayPart -> [DayPart]
(DayPart -> DayPart)
-> (DayPart -> DayPart)
-> (Int -> DayPart)
-> (DayPart -> Int)
-> (DayPart -> [DayPart])
-> (DayPart -> DayPart -> [DayPart])
-> (DayPart -> DayPart -> [DayPart])
-> (DayPart -> DayPart -> DayPart -> [DayPart])
-> Enum DayPart
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: DayPart -> DayPart -> DayPart -> [DayPart]
$cenumFromThenTo :: DayPart -> DayPart -> DayPart -> [DayPart]
enumFromTo :: DayPart -> DayPart -> [DayPart]
$cenumFromTo :: DayPart -> DayPart -> [DayPart]
enumFromThen :: DayPart -> DayPart -> [DayPart]
$cenumFromThen :: DayPart -> DayPart -> [DayPart]
enumFrom :: DayPart -> [DayPart]
$cenumFrom :: DayPart -> [DayPart]
fromEnum :: DayPart -> Int
$cfromEnum :: DayPart -> Int
toEnum :: Int -> DayPart
$ctoEnum :: Int -> DayPart
pred :: DayPart -> DayPart
$cpred :: DayPart -> DayPart
succ :: DayPart -> DayPart
$csucc :: DayPart -> DayPart
Enum, DayPart -> DayPart -> Bool
(DayPart -> DayPart -> Bool)
-> (DayPart -> DayPart -> Bool) -> Eq DayPart
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: DayPart -> DayPart -> Bool
$c/= :: DayPart -> DayPart -> Bool
== :: DayPart -> DayPart -> Bool
$c== :: DayPart -> DayPart -> Bool
Eq, Eq DayPart
Eq DayPart
-> (DayPart -> DayPart -> Ordering)
-> (DayPart -> DayPart -> Bool)
-> (DayPart -> DayPart -> Bool)
-> (DayPart -> DayPart -> Bool)
-> (DayPart -> DayPart -> Bool)
-> (DayPart -> DayPart -> DayPart)
-> (DayPart -> DayPart -> DayPart)
-> Ord DayPart
DayPart -> DayPart -> Bool
DayPart -> DayPart -> Ordering
DayPart -> DayPart -> DayPart
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: DayPart -> DayPart -> DayPart
$cmin :: DayPart -> DayPart -> DayPart
max :: DayPart -> DayPart -> DayPart
$cmax :: DayPart -> DayPart -> DayPart
>= :: DayPart -> DayPart -> Bool
$c>= :: DayPart -> DayPart -> Bool
> :: DayPart -> DayPart -> Bool
$c> :: DayPart -> DayPart -> Bool
<= :: DayPart -> DayPart -> Bool
$c<= :: DayPart -> DayPart -> Bool
< :: DayPart -> DayPart -> Bool
$c< :: DayPart -> DayPart -> Bool
compare :: DayPart -> DayPart -> Ordering
$ccompare :: DayPart -> DayPart -> Ordering
$cp1Ord :: Eq DayPart
Ord, ReadPrec [DayPart]
ReadPrec DayPart
Int -> ReadS DayPart
ReadS [DayPart]
(Int -> ReadS DayPart)
-> ReadS [DayPart]
-> ReadPrec DayPart
-> ReadPrec [DayPart]
-> Read DayPart
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [DayPart]
$creadListPrec :: ReadPrec [DayPart]
readPrec :: ReadPrec DayPart
$creadPrec :: ReadPrec DayPart
readList :: ReadS [DayPart]
$creadList :: ReadS [DayPart]
readsPrec :: Int -> ReadS DayPart
$creadsPrec :: Int -> ReadS DayPart
Read, Int -> DayPart -> ShowS
[DayPart] -> ShowS
DayPart -> String
(Int -> DayPart -> ShowS)
-> (DayPart -> String) -> ([DayPart] -> ShowS) -> Show DayPart
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [DayPart] -> ShowS
$cshowList :: [DayPart] -> ShowS
show :: DayPart -> String
$cshow :: DayPart -> String
showsPrec :: Int -> DayPart -> ShowS
$cshowsPrec :: Int -> DayPart -> ShowS
Show)
instance Arbitrary DayPart where
arbitrary :: Gen DayPart
arbitrary = Gen DayPart
forall a. (Bounded a, Enum a) => Gen a
arbitraryBoundedEnum
data DaySegment
= DaySegment {
DaySegment -> DayPart
dayPart :: DayPart
, DaySegment -> Int
dayHour :: Int
}
deriving (DaySegment -> DaySegment -> Bool
(DaySegment -> DaySegment -> Bool)
-> (DaySegment -> DaySegment -> Bool) -> Eq DaySegment
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: DaySegment -> DaySegment -> Bool
$c/= :: DaySegment -> DaySegment -> Bool
== :: DaySegment -> DaySegment -> Bool
$c== :: DaySegment -> DaySegment -> Bool
Eq, Eq DaySegment
Eq DaySegment
-> (DaySegment -> DaySegment -> Ordering)
-> (DaySegment -> DaySegment -> Bool)
-> (DaySegment -> DaySegment -> Bool)
-> (DaySegment -> DaySegment -> Bool)
-> (DaySegment -> DaySegment -> Bool)
-> (DaySegment -> DaySegment -> DaySegment)
-> (DaySegment -> DaySegment -> DaySegment)
-> Ord DaySegment
DaySegment -> DaySegment -> Bool
DaySegment -> DaySegment -> Ordering
DaySegment -> DaySegment -> DaySegment
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: DaySegment -> DaySegment -> DaySegment
$cmin :: DaySegment -> DaySegment -> DaySegment
max :: DaySegment -> DaySegment -> DaySegment
$cmax :: DaySegment -> DaySegment -> DaySegment
>= :: DaySegment -> DaySegment -> Bool
$c>= :: DaySegment -> DaySegment -> Bool
> :: DaySegment -> DaySegment -> Bool
$c> :: DaySegment -> DaySegment -> Bool
<= :: DaySegment -> DaySegment -> Bool
$c<= :: DaySegment -> DaySegment -> Bool
< :: DaySegment -> DaySegment -> Bool
$c< :: DaySegment -> DaySegment -> Bool
compare :: DaySegment -> DaySegment -> Ordering
$ccompare :: DaySegment -> DaySegment -> Ordering
$cp1Ord :: Eq DaySegment
Ord, ReadPrec [DaySegment]
ReadPrec DaySegment
Int -> ReadS DaySegment
ReadS [DaySegment]
(Int -> ReadS DaySegment)
-> ReadS [DaySegment]
-> ReadPrec DaySegment
-> ReadPrec [DaySegment]
-> Read DaySegment
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [DaySegment]
$creadListPrec :: ReadPrec [DaySegment]
readPrec :: ReadPrec DaySegment
$creadPrec :: ReadPrec DaySegment
readList :: ReadS [DaySegment]
$creadList :: ReadS [DaySegment]
readsPrec :: Int -> ReadS DaySegment
$creadsPrec :: Int -> ReadS DaySegment
Read, Int -> DaySegment -> ShowS
[DaySegment] -> ShowS
DaySegment -> String
(Int -> DaySegment -> ShowS)
-> (DaySegment -> String)
-> ([DaySegment] -> ShowS)
-> Show DaySegment
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [DaySegment] -> ShowS
$cshowList :: [DaySegment] -> ShowS
show :: DaySegment -> String
$cshow :: DaySegment -> String
showsPrec :: Int -> DaySegment -> ShowS
$cshowsPrec :: Int -> DaySegment -> ShowS
Show)
instance Arbitrary DaySegment where
arbitrary :: Gen DaySegment
arbitrary = Int -> DaySegment
toDaySegment (Int -> DaySegment) -> Gen Int -> Gen DaySegment
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Int, Int) -> Gen Int
forall a. Random a => (a, a) -> Gen a
choose (Int
0, Int
23)
toClockSegment
:: Int
-> ClockSegment
toClockSegment :: Int -> ClockSegment
toClockSegment Int
0 = ClockSegment
OClock
toClockSegment Int
15 = ClockSegment
QuarterPast
toClockSegment Int
30 = ClockSegment
Half
toClockSegment Int
45 = ClockSegment
QuarterTo
toClockSegment Int
n
| Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
15 = Int -> ClockSegment
Past Int
n
| Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
30 = Int -> ClockSegment
ToHalf (Int
30Int -> Int -> Int
forall a. Num a => a -> a -> a
-Int
n)
| Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
45 = Int -> ClockSegment
PastHalf (Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
30)
| Bool
otherwise = Int -> ClockSegment
To (Int
60Int -> Int -> Int
forall a. Num a => a -> a -> a
-Int
n)
toDayPart
:: Int
-> DayPart
toDayPart :: Int -> DayPart
toDayPart Int
n
| Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
5 = DayPart
Night
| Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
11 = DayPart
Morning
| Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
17 = DayPart
Afternoon
| Bool
otherwise = DayPart
Evening
toDaySegment
:: Int
-> DaySegment
toDaySegment :: Int -> DaySegment
toDaySegment Int
n = DayPart -> Int -> DaySegment
DaySegment (Int -> DayPart
toDayPart Int
n) (Int -> Int
hourCorrection Int
n)
hourCorrection
:: Int
-> Int
hourCorrection :: Int -> Int
hourCorrection Int
h = ((Int
h Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
12) Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1
instance Default NumberType where
def :: NumberType
def = NumberType
Cardinal
class NumToWord a where
toCardinal :: Integral i
=> a
-> i
-> Text
toCardinal = NumberType -> a -> i -> Text
forall a i.
(NumToWord a, Integral i) =>
NumberType -> a -> i -> Text
toWords NumberType
Cardinal
toOrdinal :: Integral i
=> a
-> i
-> Text
toOrdinal = NumberType -> a -> i -> Text
forall a i.
(NumToWord a, Integral i) =>
NumberType -> a -> i -> Text
toWords NumberType
Ordinal
toShortOrdinal :: Integral i
=> a
-> i
-> Text
toShortOrdinal = NumberType -> a -> i -> Text
forall a i.
(NumToWord a, Integral i) =>
NumberType -> a -> i -> Text
toWords NumberType
Ordinal
toWords :: Integral i
=> NumberType
-> a
-> i
-> Text
toWords NumberType
Cardinal = a -> i -> Text
forall a i. (NumToWord a, Integral i) => a -> i -> Text
toCardinal
toWords NumberType
Ordinal = a -> i -> Text
forall a i. (NumToWord a, Integral i) => a -> i -> Text
toOrdinal
toWords NumberType
ShortOrdinal = a -> i -> Text
forall a i. (NumToWord a, Integral i) => a -> i -> Text
toShortOrdinal
toTimeText
:: a
-> TimeOfDay
-> Text
toTimeText a
gen (TimeOfDay Int
h Int
m Pico
_) = a -> Int -> Int -> Text
forall a. NumToWord a => a -> Int -> Int -> Text
toTimeText' a
gen Int
h Int
m
toTimeText'
:: a
-> Int
-> Int
-> Text
toTimeText' a
gen Int
h Int
m = a -> TimeOfDay -> Text
forall a. NumToWord a => a -> TimeOfDay -> Text
toTimeText a
gen (Int -> Int -> Pico -> TimeOfDay
TimeOfDay Int
h Int
m Pico
0)
{-# MINIMAL ((toCardinal, toOrdinal, toShortOrdinal) | toWords), (toTimeText | toTimeText') #-}
currentTimeText :: NumToWord a
=> TimeZone
-> a
-> IO Text
currentTimeText :: TimeZone -> a -> IO Text
currentTimeText TimeZone
tz a
alg = a -> TimeOfDay -> Text
forall a. NumToWord a => a -> TimeOfDay -> Text
toTimeText a
alg (TimeOfDay -> Text) -> (UTCTime -> TimeOfDay) -> UTCTime -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Integer, TimeOfDay) -> TimeOfDay
forall a b. (a, b) -> b
snd ((Integer, TimeOfDay) -> TimeOfDay)
-> (UTCTime -> (Integer, TimeOfDay)) -> UTCTime -> TimeOfDay
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TimeZone -> TimeOfDay -> (Integer, TimeOfDay)
utcToLocalTimeOfDay TimeZone
tz (TimeOfDay -> (Integer, TimeOfDay))
-> (UTCTime -> TimeOfDay) -> UTCTime -> (Integer, TimeOfDay)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DiffTime -> TimeOfDay
timeToTimeOfDay (DiffTime -> TimeOfDay)
-> (UTCTime -> DiffTime) -> UTCTime -> TimeOfDay
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UTCTime -> DiffTime
utctDayTime (UTCTime -> Text) -> IO UTCTime -> IO Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IO UTCTime
getCurrentTime
currentTimeText' :: NumToWord a
=> a
-> IO Text
currentTimeText' :: a -> IO Text
currentTimeText' a
alg = a -> TimeOfDay -> Text
forall a. NumToWord a => a -> TimeOfDay -> Text
toTimeText a
alg (TimeOfDay -> Text) -> (UTCTime -> TimeOfDay) -> UTCTime -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DiffTime -> TimeOfDay
timeToTimeOfDay (DiffTime -> TimeOfDay)
-> (UTCTime -> DiffTime) -> UTCTime -> TimeOfDay
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UTCTime -> DiffTime
utctDayTime (UTCTime -> Text) -> IO UTCTime -> IO Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IO UTCTime
getCurrentTime
class ValueSplit a where
valueSplit :: a -> FreeValueSplitter