{-# LANGUAGE DeriveDataTypeable, DeriveGeneric, OverloadedStrings, Safe, TypeApplications #-}
module Data.Char.Emoji.Clock (
Clock, hours, minutes30, clock, closestClock
) where
import Control.DeepSeq(NFData)
import Data.Bits((.|.), shiftL, shiftR)
import Data.Bool(bool)
import Data.Char(chr, ord)
import Data.Char.Core(UnicodeCharacter(toUnicodeChar, fromUnicodeChar, isInCharRange), UnicodeText(isInTextRange), generateIsInTextRange')
import Data.Data(Data)
import Data.Hashable(Hashable)
import GHC.Enum(toEnumError)
import GHC.Generics(Generic)
import Test.QuickCheck.Arbitrary(Arbitrary(arbitrary), arbitraryBoundedEnum)
data Clock = Clock {
Clock -> Int
hours :: Int
, Clock -> Bool
minutes30 :: Bool
} deriving (Typeable Clock
Clock -> DataType
Clock -> Constr
(forall b. Data b => b -> b) -> Clock -> Clock
forall a.
Typeable a
-> (forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> Clock -> u
forall u. (forall d. Data d => d -> u) -> Clock -> [u]
forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Clock -> r
forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Clock -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Clock -> m Clock
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Clock -> m Clock
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Clock
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Clock -> c Clock
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Clock)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Clock)
gmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Clock -> m Clock
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Clock -> m Clock
gmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Clock -> m Clock
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Clock -> m Clock
gmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Clock -> m Clock
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Clock -> m Clock
gmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> Clock -> u
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> Clock -> u
gmapQ :: forall u. (forall d. Data d => d -> u) -> Clock -> [u]
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> Clock -> [u]
gmapQr :: forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Clock -> r
$cgmapQr :: forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Clock -> r
gmapQl :: forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Clock -> r
$cgmapQl :: forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Clock -> r
gmapT :: (forall b. Data b => b -> b) -> Clock -> Clock
$cgmapT :: (forall b. Data b => b -> b) -> Clock -> Clock
dataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Clock)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Clock)
dataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Clock)
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Clock)
dataTypeOf :: Clock -> DataType
$cdataTypeOf :: Clock -> DataType
toConstr :: Clock -> Constr
$ctoConstr :: Clock -> Constr
gunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Clock
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Clock
gfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Clock -> c Clock
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Clock -> c Clock
Data, Clock -> Clock -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Clock -> Clock -> Bool
$c/= :: Clock -> Clock -> Bool
== :: Clock -> Clock -> Bool
$c== :: Clock -> Clock -> Bool
Eq, forall x. Rep Clock x -> Clock
forall x. Clock -> Rep Clock x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Clock x -> Clock
$cfrom :: forall x. Clock -> Rep Clock x
Generic, Eq Clock
Clock -> Clock -> Bool
Clock -> Clock -> Ordering
Clock -> Clock -> Clock
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 :: Clock -> Clock -> Clock
$cmin :: Clock -> Clock -> Clock
max :: Clock -> Clock -> Clock
$cmax :: Clock -> Clock -> Clock
>= :: Clock -> Clock -> Bool
$c>= :: Clock -> Clock -> Bool
> :: Clock -> Clock -> Bool
$c> :: Clock -> Clock -> Bool
<= :: Clock -> Clock -> Bool
$c<= :: Clock -> Clock -> Bool
< :: Clock -> Clock -> Bool
$c< :: Clock -> Clock -> Bool
compare :: Clock -> Clock -> Ordering
$ccompare :: Clock -> Clock -> Ordering
Ord, ReadPrec [Clock]
ReadPrec Clock
Int -> ReadS Clock
ReadS [Clock]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [Clock]
$creadListPrec :: ReadPrec [Clock]
readPrec :: ReadPrec Clock
$creadPrec :: ReadPrec Clock
readList :: ReadS [Clock]
$creadList :: ReadS [Clock]
readsPrec :: Int -> ReadS Clock
$creadsPrec :: Int -> ReadS Clock
Read, Int -> Clock -> ShowS
[Clock] -> ShowS
Clock -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Clock] -> ShowS
$cshowList :: [Clock] -> ShowS
show :: Clock -> String
$cshow :: Clock -> String
showsPrec :: Int -> Clock -> ShowS
$cshowsPrec :: Int -> Clock -> ShowS
Show)
instance Hashable Clock
instance NFData Clock
instance Bounded Clock where
minBound :: Clock
minBound = Int -> Bool -> Clock
Clock Int
0 Bool
True
maxBound :: Clock
maxBound = Int -> Bool -> Clock
Clock Int
12 Bool
False
instance Enum Clock where
fromEnum :: Clock -> Int
fromEnum (Clock Int
h Bool
m30) = forall a. Enum a => a -> a
pred (forall a. Bits a => a -> Int -> a
shiftL Int
h Int
1 forall a. Bits a => a -> a -> a
.|. forall a. a -> a -> Bool -> a
bool Int
0 Int
1 Bool
m30)
toEnum :: Int -> Clock
toEnum Int
hm30
| Int
hm30 forall a. Ord a => a -> a -> Bool
< Int
0 Bool -> Bool -> Bool
|| Int
hm30 forall a. Ord a => a -> a -> Bool
> Int
23 = forall a b. Show a => String -> Int -> (a, a) -> b
toEnumError String
"Clock" Int
hm30 (forall a. Bounded a => a
minBound :: Clock, forall a. Bounded a => a
maxBound)
| Bool
otherwise = Int -> Bool -> Clock
Clock (forall a. Bits a => a -> Int -> a
shiftR Int
hm30' Int
1) (forall a. Integral a => a -> Bool
odd Int
hm30')
where hm30' :: Int
hm30' = forall a. Enum a => a -> a
succ Int
hm30
enumFrom :: Clock -> [Clock]
enumFrom = (forall a. Enum a => a -> a -> [a]
`enumFromTo` forall a. Bounded a => a
maxBound)
enumFromThen :: Clock -> Clock -> [Clock]
enumFromThen Clock
x Clock
y = forall a. Enum a => a -> a -> a -> [a]
enumFromThenTo Clock
x Clock
y forall a. Bounded a => a
maxBound
closestClock
:: Int
-> Int
-> Clock
closestClock :: Int -> Int -> Clock
closestClock Int
h Int
m
| Int
m forall a. Ord a => a -> a -> Bool
< Int
15 = Int -> Bool -> Clock
clock Int
h Bool
False
| Int
m forall a. Ord a => a -> a -> Bool
< Int
45 = Int -> Bool -> Clock
clock Int
h Bool
True
| Bool
otherwise = Int -> Bool -> Clock
clock (Int
hforall a. Num a => a -> a -> a
+Int
1) Bool
False
clock
:: Int
-> Bool
-> Clock
clock :: Int -> Bool -> Clock
clock Int
h Bool
b
| Bool
b Bool -> Bool -> Bool
&& Int
h' forall a. Eq a => a -> a -> Bool
== Int
12 = Int -> Bool -> Clock
Clock Int
0 Bool
True
| Bool
otherwise = Int -> Bool -> Clock
Clock Int
h' Bool
b
where h' :: Int
h' = forall a. Integral a => a -> a -> a
mod (Int
hforall a. Num a => a -> a -> a
-Int
1) Int
12 forall a. Num a => a -> a -> a
+ Int
1
instance Arbitrary Clock where
arbitrary :: Gen Clock
arbitrary = forall a. (Bounded a, Enum a) => Gen a
arbitraryBoundedEnum
instance UnicodeCharacter Clock where
toUnicodeChar :: Clock -> Char
toUnicodeChar (Clock Int
h Bool
False) = Int -> Char
chr (Int
0x1f54f forall a. Num a => a -> a -> a
+ Int
h)
toUnicodeChar (Clock Int
h Bool
True) = Int -> Char
chr (Int
0x1f55c forall a. Num a => a -> a -> a
+ forall a. Integral a => a -> a -> a
mod (Int
hforall a. Num a => a -> a -> a
-Int
1) Int
12)
fromUnicodeChar :: Char -> Maybe Clock
fromUnicodeChar Char
c
| Char
c forall a. Ord a => a -> a -> Bool
< Char
'\x1f550' = forall a. Maybe a
Nothing
| Char
c forall a. Ord a => a -> a -> Bool
< Char
'\x1f55c' = forall a. a -> Maybe a
Just (Int -> Bool -> Clock
Clock (Char -> Int
ord Char
c forall a. Num a => a -> a -> a
- Int
0x1f54f) Bool
False)
| Char
c forall a. Ord a => a -> a -> Bool
< Char
'\x1f568' = forall a. a -> Maybe a
Just (Int -> Bool -> Clock
Clock (forall a. Integral a => a -> a -> a
mod (Char -> Int
ord Char
c forall a. Num a => a -> a -> a
- Int
0x1f55b) Int
12) Bool
True)
| Bool
otherwise = forall a. Maybe a
Nothing
isInCharRange :: Char -> Bool
isInCharRange Char
c = Char
'\x1f550' forall a. Ord a => a -> a -> Bool
<= Char
c Bool -> Bool -> Bool
&& Char
c forall a. Ord a => a -> a -> Bool
<= Char
'\x1f567'
instance UnicodeText Clock where
isInTextRange :: Text -> Bool
isInTextRange = forall a. UnicodeCharacter a => Text -> Bool
generateIsInTextRange' @Clock