{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE AllowAmbiguousTypes #-}
module Data.HodaTime.Calendar.Islamic
(
calendarDate
,fromNthDay
,fromWeekDate
,calendarDate'
,fromNthDay'
,fromWeekDate'
,Month(..)
,DayOfWeek(..)
,Islamic
,LeapPattern(..)
,KnownLeap
,IslamicBcl
,IslamicBase15
,IslamicBase16
,IslamicIndian
,IslamicHabashAlHasib
)
where
import Data.HodaTime.CalendarDateTime.Internal (IsCalendar(..), IsCalendarDateTime(..), CalendarDate, DayNth, DayOfMonth, Year, WeekNumber, CalendarDateTime(..), LocalTime(..), Date)
import Control.DeepSeq (NFData(..))
import Data.Hashable (Hashable(..))
import Data.HodaTime.Instant.Internal (Instant(..))
import Data.HodaTime.Calendar.Internal (mkCommonDaySetter, mkCommonMonthSetter, mkYearSetter, mkFromNthDay, mkFromWeekDate, moveByDow, dayOfWeekFromDays)
import Data.Bits ((.&.), shiftL, testBit, popCount)
import Data.Int (Int32)
import Data.Word (Word8)
import Control.Monad (guard)
monthsPerYear :: Int
monthsPerYear :: Int
monthsPerYear = Int
12
daysPerNonLeapYear :: Int
daysPerNonLeapYear :: Int
daysPerNonLeapYear = Int
354
daysPerLeapYear :: Int
daysPerLeapYear :: Int
daysPerLeapYear = Int
355
daysPerCycle :: Int
daysPerCycle :: Int
daysPerCycle = Int
19 Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
daysPerNonLeapYear Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
11 Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
daysPerLeapYear
data LeapPattern = Base15 | Base16 | Indian | HabashAlHasib
class KnownLeap (l :: LeapPattern) where
leapPatternBits :: Int
instance KnownLeap 'Base15 where leapPatternBits :: Int
leapPatternBits = Int
623158436
instance KnownLeap 'Base16 where leapPatternBits :: Int
leapPatternBits = Int
623191204
instance KnownLeap 'Indian where leapPatternBits :: Int
leapPatternBits = Int
690562340
instance KnownLeap 'HabashAlHasib where leapPatternBits :: Int
leapPatternBits = Int
153692453
islamicMonthDayOffsets :: [Int]
islamicMonthDayOffsets :: [Int]
islamicMonthDayOffsets = [Int
0, Int
30, Int
59, Int
89, Int
118, Int
148, Int
177, Int
207, Int
236, Int
266, Int
295, Int
325]
islamicEpoch :: Int
islamicEpoch :: Int
islamicEpoch = -Int
503166
firstIslDayTuple :: (Integral a, Integral b, Integral c) => (a, b, c)
firstIslDayTuple :: forall a b c. (Integral a, Integral b, Integral c) => (a, b, c)
firstIslDayTuple = (a
1, b
0, c
1)
invalidDayThresh :: Integral a => a
invalidDayThresh :: forall a. Integral a => a
invalidDayThresh = Int -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Int
forall a. Enum a => a -> a
pred Int
islamicEpoch)
epochDayOfWeek :: DayOfWeek (Islamic l)
epochDayOfWeek :: forall (l :: LeapPattern). DayOfWeek (Islamic l)
epochDayOfWeek = DayOfWeek (Islamic l)
forall (l :: LeapPattern). DayOfWeek (Islamic l)
Wednesday
data Islamic (l :: LeapPattern)
type IslamicBase15 = Islamic 'Base15
type IslamicBase16 = Islamic 'Base16
type IslamicIndian = Islamic 'Indian
type IslamicHabashAlHasib = Islamic 'HabashAlHasib
type IslamicBcl = Islamic 'Base16
instance KnownLeap l => IsCalendar (Islamic l) where
data Date (Islamic l) = IslamicDate {-# UNPACK #-} !Int32 {-# UNPACK #-} !Word8 {-# UNPACK #-} !Word8 {-# UNPACK #-} !Int32
deriving (Date (Islamic l) -> Date (Islamic l) -> Bool
(Date (Islamic l) -> Date (Islamic l) -> Bool)
-> (Date (Islamic l) -> Date (Islamic l) -> Bool)
-> Eq (Date (Islamic l))
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall (l :: LeapPattern).
Date (Islamic l) -> Date (Islamic l) -> Bool
$c== :: forall (l :: LeapPattern).
Date (Islamic l) -> Date (Islamic l) -> Bool
== :: Date (Islamic l) -> Date (Islamic l) -> Bool
$c/= :: forall (l :: LeapPattern).
Date (Islamic l) -> Date (Islamic l) -> Bool
/= :: Date (Islamic l) -> Date (Islamic l) -> Bool
Eq, Eq (Date (Islamic l))
Eq (Date (Islamic l)) =>
(Date (Islamic l) -> Date (Islamic l) -> Ordering)
-> (Date (Islamic l) -> Date (Islamic l) -> Bool)
-> (Date (Islamic l) -> Date (Islamic l) -> Bool)
-> (Date (Islamic l) -> Date (Islamic l) -> Bool)
-> (Date (Islamic l) -> Date (Islamic l) -> Bool)
-> (Date (Islamic l) -> Date (Islamic l) -> Date (Islamic l))
-> (Date (Islamic l) -> Date (Islamic l) -> Date (Islamic l))
-> Ord (Date (Islamic l))
Date (Islamic l) -> Date (Islamic l) -> Bool
Date (Islamic l) -> Date (Islamic l) -> Ordering
Date (Islamic l) -> Date (Islamic l) -> Date (Islamic l)
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 (l :: LeapPattern). Eq (Date (Islamic l))
forall (l :: LeapPattern).
Date (Islamic l) -> Date (Islamic l) -> Bool
forall (l :: LeapPattern).
Date (Islamic l) -> Date (Islamic l) -> Ordering
forall (l :: LeapPattern).
Date (Islamic l) -> Date (Islamic l) -> Date (Islamic l)
$ccompare :: forall (l :: LeapPattern).
Date (Islamic l) -> Date (Islamic l) -> Ordering
compare :: Date (Islamic l) -> Date (Islamic l) -> Ordering
$c< :: forall (l :: LeapPattern).
Date (Islamic l) -> Date (Islamic l) -> Bool
< :: Date (Islamic l) -> Date (Islamic l) -> Bool
$c<= :: forall (l :: LeapPattern).
Date (Islamic l) -> Date (Islamic l) -> Bool
<= :: Date (Islamic l) -> Date (Islamic l) -> Bool
$c> :: forall (l :: LeapPattern).
Date (Islamic l) -> Date (Islamic l) -> Bool
> :: Date (Islamic l) -> Date (Islamic l) -> Bool
$c>= :: forall (l :: LeapPattern).
Date (Islamic l) -> Date (Islamic l) -> Bool
>= :: Date (Islamic l) -> Date (Islamic l) -> Bool
$cmax :: forall (l :: LeapPattern).
Date (Islamic l) -> Date (Islamic l) -> Date (Islamic l)
max :: Date (Islamic l) -> Date (Islamic l) -> Date (Islamic l)
$cmin :: forall (l :: LeapPattern).
Date (Islamic l) -> Date (Islamic l) -> Date (Islamic l)
min :: Date (Islamic l) -> Date (Islamic l) -> Date (Islamic l)
Ord)
data DayOfWeek (Islamic l) = Sunday | Monday | Tuesday | Wednesday | Thursday | Friday | Saturday
deriving (Int -> DayOfWeek (Islamic l) -> ShowS
[DayOfWeek (Islamic l)] -> ShowS
DayOfWeek (Islamic l) -> String
(Int -> DayOfWeek (Islamic l) -> ShowS)
-> (DayOfWeek (Islamic l) -> String)
-> ([DayOfWeek (Islamic l)] -> ShowS)
-> Show (DayOfWeek (Islamic l))
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall (l :: LeapPattern). Int -> DayOfWeek (Islamic l) -> ShowS
forall (l :: LeapPattern). [DayOfWeek (Islamic l)] -> ShowS
forall (l :: LeapPattern). DayOfWeek (Islamic l) -> String
$cshowsPrec :: forall (l :: LeapPattern). Int -> DayOfWeek (Islamic l) -> ShowS
showsPrec :: Int -> DayOfWeek (Islamic l) -> ShowS
$cshow :: forall (l :: LeapPattern). DayOfWeek (Islamic l) -> String
show :: DayOfWeek (Islamic l) -> String
$cshowList :: forall (l :: LeapPattern). [DayOfWeek (Islamic l)] -> ShowS
showList :: [DayOfWeek (Islamic l)] -> ShowS
Show, ReadPrec [DayOfWeek (Islamic l)]
ReadPrec (DayOfWeek (Islamic l))
Int -> ReadS (DayOfWeek (Islamic l))
ReadS [DayOfWeek (Islamic l)]
(Int -> ReadS (DayOfWeek (Islamic l)))
-> ReadS [DayOfWeek (Islamic l)]
-> ReadPrec (DayOfWeek (Islamic l))
-> ReadPrec [DayOfWeek (Islamic l)]
-> Read (DayOfWeek (Islamic l))
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
forall (l :: LeapPattern). ReadPrec [DayOfWeek (Islamic l)]
forall (l :: LeapPattern). ReadPrec (DayOfWeek (Islamic l))
forall (l :: LeapPattern). Int -> ReadS (DayOfWeek (Islamic l))
forall (l :: LeapPattern). ReadS [DayOfWeek (Islamic l)]
$creadsPrec :: forall (l :: LeapPattern). Int -> ReadS (DayOfWeek (Islamic l))
readsPrec :: Int -> ReadS (DayOfWeek (Islamic l))
$creadList :: forall (l :: LeapPattern). ReadS [DayOfWeek (Islamic l)]
readList :: ReadS [DayOfWeek (Islamic l)]
$creadPrec :: forall (l :: LeapPattern). ReadPrec (DayOfWeek (Islamic l))
readPrec :: ReadPrec (DayOfWeek (Islamic l))
$creadListPrec :: forall (l :: LeapPattern). ReadPrec [DayOfWeek (Islamic l)]
readListPrec :: ReadPrec [DayOfWeek (Islamic l)]
Read, DayOfWeek (Islamic l) -> DayOfWeek (Islamic l) -> Bool
(DayOfWeek (Islamic l) -> DayOfWeek (Islamic l) -> Bool)
-> (DayOfWeek (Islamic l) -> DayOfWeek (Islamic l) -> Bool)
-> Eq (DayOfWeek (Islamic l))
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall (l :: LeapPattern).
DayOfWeek (Islamic l) -> DayOfWeek (Islamic l) -> Bool
$c== :: forall (l :: LeapPattern).
DayOfWeek (Islamic l) -> DayOfWeek (Islamic l) -> Bool
== :: DayOfWeek (Islamic l) -> DayOfWeek (Islamic l) -> Bool
$c/= :: forall (l :: LeapPattern).
DayOfWeek (Islamic l) -> DayOfWeek (Islamic l) -> Bool
/= :: DayOfWeek (Islamic l) -> DayOfWeek (Islamic l) -> Bool
Eq, Eq (DayOfWeek (Islamic l))
Eq (DayOfWeek (Islamic l)) =>
(DayOfWeek (Islamic l) -> DayOfWeek (Islamic l) -> Ordering)
-> (DayOfWeek (Islamic l) -> DayOfWeek (Islamic l) -> Bool)
-> (DayOfWeek (Islamic l) -> DayOfWeek (Islamic l) -> Bool)
-> (DayOfWeek (Islamic l) -> DayOfWeek (Islamic l) -> Bool)
-> (DayOfWeek (Islamic l) -> DayOfWeek (Islamic l) -> Bool)
-> (DayOfWeek (Islamic l)
-> DayOfWeek (Islamic l) -> DayOfWeek (Islamic l))
-> (DayOfWeek (Islamic l)
-> DayOfWeek (Islamic l) -> DayOfWeek (Islamic l))
-> Ord (DayOfWeek (Islamic l))
DayOfWeek (Islamic l) -> DayOfWeek (Islamic l) -> Bool
DayOfWeek (Islamic l) -> DayOfWeek (Islamic l) -> Ordering
DayOfWeek (Islamic l)
-> DayOfWeek (Islamic l) -> DayOfWeek (Islamic l)
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 (l :: LeapPattern). Eq (DayOfWeek (Islamic l))
forall (l :: LeapPattern).
DayOfWeek (Islamic l) -> DayOfWeek (Islamic l) -> Bool
forall (l :: LeapPattern).
DayOfWeek (Islamic l) -> DayOfWeek (Islamic l) -> Ordering
forall (l :: LeapPattern).
DayOfWeek (Islamic l)
-> DayOfWeek (Islamic l) -> DayOfWeek (Islamic l)
$ccompare :: forall (l :: LeapPattern).
DayOfWeek (Islamic l) -> DayOfWeek (Islamic l) -> Ordering
compare :: DayOfWeek (Islamic l) -> DayOfWeek (Islamic l) -> Ordering
$c< :: forall (l :: LeapPattern).
DayOfWeek (Islamic l) -> DayOfWeek (Islamic l) -> Bool
< :: DayOfWeek (Islamic l) -> DayOfWeek (Islamic l) -> Bool
$c<= :: forall (l :: LeapPattern).
DayOfWeek (Islamic l) -> DayOfWeek (Islamic l) -> Bool
<= :: DayOfWeek (Islamic l) -> DayOfWeek (Islamic l) -> Bool
$c> :: forall (l :: LeapPattern).
DayOfWeek (Islamic l) -> DayOfWeek (Islamic l) -> Bool
> :: DayOfWeek (Islamic l) -> DayOfWeek (Islamic l) -> Bool
$c>= :: forall (l :: LeapPattern).
DayOfWeek (Islamic l) -> DayOfWeek (Islamic l) -> Bool
>= :: DayOfWeek (Islamic l) -> DayOfWeek (Islamic l) -> Bool
$cmax :: forall (l :: LeapPattern).
DayOfWeek (Islamic l)
-> DayOfWeek (Islamic l) -> DayOfWeek (Islamic l)
max :: DayOfWeek (Islamic l)
-> DayOfWeek (Islamic l) -> DayOfWeek (Islamic l)
$cmin :: forall (l :: LeapPattern).
DayOfWeek (Islamic l)
-> DayOfWeek (Islamic l) -> DayOfWeek (Islamic l)
min :: DayOfWeek (Islamic l)
-> DayOfWeek (Islamic l) -> DayOfWeek (Islamic l)
Ord, Int -> DayOfWeek (Islamic l)
DayOfWeek (Islamic l) -> Int
DayOfWeek (Islamic l) -> [DayOfWeek (Islamic l)]
DayOfWeek (Islamic l) -> DayOfWeek (Islamic l)
DayOfWeek (Islamic l)
-> DayOfWeek (Islamic l) -> [DayOfWeek (Islamic l)]
DayOfWeek (Islamic l)
-> DayOfWeek (Islamic l)
-> DayOfWeek (Islamic l)
-> [DayOfWeek (Islamic l)]
(DayOfWeek (Islamic l) -> DayOfWeek (Islamic l))
-> (DayOfWeek (Islamic l) -> DayOfWeek (Islamic l))
-> (Int -> DayOfWeek (Islamic l))
-> (DayOfWeek (Islamic l) -> Int)
-> (DayOfWeek (Islamic l) -> [DayOfWeek (Islamic l)])
-> (DayOfWeek (Islamic l)
-> DayOfWeek (Islamic l) -> [DayOfWeek (Islamic l)])
-> (DayOfWeek (Islamic l)
-> DayOfWeek (Islamic l) -> [DayOfWeek (Islamic l)])
-> (DayOfWeek (Islamic l)
-> DayOfWeek (Islamic l)
-> DayOfWeek (Islamic l)
-> [DayOfWeek (Islamic l)])
-> Enum (DayOfWeek (Islamic l))
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
forall (l :: LeapPattern). Int -> DayOfWeek (Islamic l)
forall (l :: LeapPattern). DayOfWeek (Islamic l) -> Int
forall (l :: LeapPattern).
DayOfWeek (Islamic l) -> [DayOfWeek (Islamic l)]
forall (l :: LeapPattern).
DayOfWeek (Islamic l) -> DayOfWeek (Islamic l)
forall (l :: LeapPattern).
DayOfWeek (Islamic l)
-> DayOfWeek (Islamic l) -> [DayOfWeek (Islamic l)]
forall (l :: LeapPattern).
DayOfWeek (Islamic l)
-> DayOfWeek (Islamic l)
-> DayOfWeek (Islamic l)
-> [DayOfWeek (Islamic l)]
$csucc :: forall (l :: LeapPattern).
DayOfWeek (Islamic l) -> DayOfWeek (Islamic l)
succ :: DayOfWeek (Islamic l) -> DayOfWeek (Islamic l)
$cpred :: forall (l :: LeapPattern).
DayOfWeek (Islamic l) -> DayOfWeek (Islamic l)
pred :: DayOfWeek (Islamic l) -> DayOfWeek (Islamic l)
$ctoEnum :: forall (l :: LeapPattern). Int -> DayOfWeek (Islamic l)
toEnum :: Int -> DayOfWeek (Islamic l)
$cfromEnum :: forall (l :: LeapPattern). DayOfWeek (Islamic l) -> Int
fromEnum :: DayOfWeek (Islamic l) -> Int
$cenumFrom :: forall (l :: LeapPattern).
DayOfWeek (Islamic l) -> [DayOfWeek (Islamic l)]
enumFrom :: DayOfWeek (Islamic l) -> [DayOfWeek (Islamic l)]
$cenumFromThen :: forall (l :: LeapPattern).
DayOfWeek (Islamic l)
-> DayOfWeek (Islamic l) -> [DayOfWeek (Islamic l)]
enumFromThen :: DayOfWeek (Islamic l)
-> DayOfWeek (Islamic l) -> [DayOfWeek (Islamic l)]
$cenumFromTo :: forall (l :: LeapPattern).
DayOfWeek (Islamic l)
-> DayOfWeek (Islamic l) -> [DayOfWeek (Islamic l)]
enumFromTo :: DayOfWeek (Islamic l)
-> DayOfWeek (Islamic l) -> [DayOfWeek (Islamic l)]
$cenumFromThenTo :: forall (l :: LeapPattern).
DayOfWeek (Islamic l)
-> DayOfWeek (Islamic l)
-> DayOfWeek (Islamic l)
-> [DayOfWeek (Islamic l)]
enumFromThenTo :: DayOfWeek (Islamic l)
-> DayOfWeek (Islamic l)
-> DayOfWeek (Islamic l)
-> [DayOfWeek (Islamic l)]
Enum, DayOfWeek (Islamic l)
DayOfWeek (Islamic l)
-> DayOfWeek (Islamic l) -> Bounded (DayOfWeek (Islamic l))
forall a. a -> a -> Bounded a
forall (l :: LeapPattern). DayOfWeek (Islamic l)
$cminBound :: forall (l :: LeapPattern). DayOfWeek (Islamic l)
minBound :: DayOfWeek (Islamic l)
$cmaxBound :: forall (l :: LeapPattern). DayOfWeek (Islamic l)
maxBound :: DayOfWeek (Islamic l)
Bounded)
data Month (Islamic l) = Muharram | Safar | RabiAlAwwal | RabiAlThani | JumadaAlAwwal | JumadaAlThani | Rajab | Shaban | Ramadan | Shawwal | DhulQadah | DhulHijjah
deriving (Int -> Month (Islamic l) -> ShowS
[Month (Islamic l)] -> ShowS
Month (Islamic l) -> String
(Int -> Month (Islamic l) -> ShowS)
-> (Month (Islamic l) -> String)
-> ([Month (Islamic l)] -> ShowS)
-> Show (Month (Islamic l))
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall (l :: LeapPattern). Int -> Month (Islamic l) -> ShowS
forall (l :: LeapPattern). [Month (Islamic l)] -> ShowS
forall (l :: LeapPattern). Month (Islamic l) -> String
$cshowsPrec :: forall (l :: LeapPattern). Int -> Month (Islamic l) -> ShowS
showsPrec :: Int -> Month (Islamic l) -> ShowS
$cshow :: forall (l :: LeapPattern). Month (Islamic l) -> String
show :: Month (Islamic l) -> String
$cshowList :: forall (l :: LeapPattern). [Month (Islamic l)] -> ShowS
showList :: [Month (Islamic l)] -> ShowS
Show, ReadPrec [Month (Islamic l)]
ReadPrec (Month (Islamic l))
Int -> ReadS (Month (Islamic l))
ReadS [Month (Islamic l)]
(Int -> ReadS (Month (Islamic l)))
-> ReadS [Month (Islamic l)]
-> ReadPrec (Month (Islamic l))
-> ReadPrec [Month (Islamic l)]
-> Read (Month (Islamic l))
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
forall (l :: LeapPattern). ReadPrec [Month (Islamic l)]
forall (l :: LeapPattern). ReadPrec (Month (Islamic l))
forall (l :: LeapPattern). Int -> ReadS (Month (Islamic l))
forall (l :: LeapPattern). ReadS [Month (Islamic l)]
$creadsPrec :: forall (l :: LeapPattern). Int -> ReadS (Month (Islamic l))
readsPrec :: Int -> ReadS (Month (Islamic l))
$creadList :: forall (l :: LeapPattern). ReadS [Month (Islamic l)]
readList :: ReadS [Month (Islamic l)]
$creadPrec :: forall (l :: LeapPattern). ReadPrec (Month (Islamic l))
readPrec :: ReadPrec (Month (Islamic l))
$creadListPrec :: forall (l :: LeapPattern). ReadPrec [Month (Islamic l)]
readListPrec :: ReadPrec [Month (Islamic l)]
Read, Month (Islamic l) -> Month (Islamic l) -> Bool
(Month (Islamic l) -> Month (Islamic l) -> Bool)
-> (Month (Islamic l) -> Month (Islamic l) -> Bool)
-> Eq (Month (Islamic l))
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall (l :: LeapPattern).
Month (Islamic l) -> Month (Islamic l) -> Bool
$c== :: forall (l :: LeapPattern).
Month (Islamic l) -> Month (Islamic l) -> Bool
== :: Month (Islamic l) -> Month (Islamic l) -> Bool
$c/= :: forall (l :: LeapPattern).
Month (Islamic l) -> Month (Islamic l) -> Bool
/= :: Month (Islamic l) -> Month (Islamic l) -> Bool
Eq, Eq (Month (Islamic l))
Eq (Month (Islamic l)) =>
(Month (Islamic l) -> Month (Islamic l) -> Ordering)
-> (Month (Islamic l) -> Month (Islamic l) -> Bool)
-> (Month (Islamic l) -> Month (Islamic l) -> Bool)
-> (Month (Islamic l) -> Month (Islamic l) -> Bool)
-> (Month (Islamic l) -> Month (Islamic l) -> Bool)
-> (Month (Islamic l) -> Month (Islamic l) -> Month (Islamic l))
-> (Month (Islamic l) -> Month (Islamic l) -> Month (Islamic l))
-> Ord (Month (Islamic l))
Month (Islamic l) -> Month (Islamic l) -> Bool
Month (Islamic l) -> Month (Islamic l) -> Ordering
Month (Islamic l) -> Month (Islamic l) -> Month (Islamic l)
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 (l :: LeapPattern). Eq (Month (Islamic l))
forall (l :: LeapPattern).
Month (Islamic l) -> Month (Islamic l) -> Bool
forall (l :: LeapPattern).
Month (Islamic l) -> Month (Islamic l) -> Ordering
forall (l :: LeapPattern).
Month (Islamic l) -> Month (Islamic l) -> Month (Islamic l)
$ccompare :: forall (l :: LeapPattern).
Month (Islamic l) -> Month (Islamic l) -> Ordering
compare :: Month (Islamic l) -> Month (Islamic l) -> Ordering
$c< :: forall (l :: LeapPattern).
Month (Islamic l) -> Month (Islamic l) -> Bool
< :: Month (Islamic l) -> Month (Islamic l) -> Bool
$c<= :: forall (l :: LeapPattern).
Month (Islamic l) -> Month (Islamic l) -> Bool
<= :: Month (Islamic l) -> Month (Islamic l) -> Bool
$c> :: forall (l :: LeapPattern).
Month (Islamic l) -> Month (Islamic l) -> Bool
> :: Month (Islamic l) -> Month (Islamic l) -> Bool
$c>= :: forall (l :: LeapPattern).
Month (Islamic l) -> Month (Islamic l) -> Bool
>= :: Month (Islamic l) -> Month (Islamic l) -> Bool
$cmax :: forall (l :: LeapPattern).
Month (Islamic l) -> Month (Islamic l) -> Month (Islamic l)
max :: Month (Islamic l) -> Month (Islamic l) -> Month (Islamic l)
$cmin :: forall (l :: LeapPattern).
Month (Islamic l) -> Month (Islamic l) -> Month (Islamic l)
min :: Month (Islamic l) -> Month (Islamic l) -> Month (Islamic l)
Ord, Int -> Month (Islamic l)
Month (Islamic l) -> Int
Month (Islamic l) -> [Month (Islamic l)]
Month (Islamic l) -> Month (Islamic l)
Month (Islamic l) -> Month (Islamic l) -> [Month (Islamic l)]
Month (Islamic l)
-> Month (Islamic l) -> Month (Islamic l) -> [Month (Islamic l)]
(Month (Islamic l) -> Month (Islamic l))
-> (Month (Islamic l) -> Month (Islamic l))
-> (Int -> Month (Islamic l))
-> (Month (Islamic l) -> Int)
-> (Month (Islamic l) -> [Month (Islamic l)])
-> (Month (Islamic l) -> Month (Islamic l) -> [Month (Islamic l)])
-> (Month (Islamic l) -> Month (Islamic l) -> [Month (Islamic l)])
-> (Month (Islamic l)
-> Month (Islamic l) -> Month (Islamic l) -> [Month (Islamic l)])
-> Enum (Month (Islamic l))
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
forall (l :: LeapPattern). Int -> Month (Islamic l)
forall (l :: LeapPattern). Month (Islamic l) -> Int
forall (l :: LeapPattern). Month (Islamic l) -> [Month (Islamic l)]
forall (l :: LeapPattern). Month (Islamic l) -> Month (Islamic l)
forall (l :: LeapPattern).
Month (Islamic l) -> Month (Islamic l) -> [Month (Islamic l)]
forall (l :: LeapPattern).
Month (Islamic l)
-> Month (Islamic l) -> Month (Islamic l) -> [Month (Islamic l)]
$csucc :: forall (l :: LeapPattern). Month (Islamic l) -> Month (Islamic l)
succ :: Month (Islamic l) -> Month (Islamic l)
$cpred :: forall (l :: LeapPattern). Month (Islamic l) -> Month (Islamic l)
pred :: Month (Islamic l) -> Month (Islamic l)
$ctoEnum :: forall (l :: LeapPattern). Int -> Month (Islamic l)
toEnum :: Int -> Month (Islamic l)
$cfromEnum :: forall (l :: LeapPattern). Month (Islamic l) -> Int
fromEnum :: Month (Islamic l) -> Int
$cenumFrom :: forall (l :: LeapPattern). Month (Islamic l) -> [Month (Islamic l)]
enumFrom :: Month (Islamic l) -> [Month (Islamic l)]
$cenumFromThen :: forall (l :: LeapPattern).
Month (Islamic l) -> Month (Islamic l) -> [Month (Islamic l)]
enumFromThen :: Month (Islamic l) -> Month (Islamic l) -> [Month (Islamic l)]
$cenumFromTo :: forall (l :: LeapPattern).
Month (Islamic l) -> Month (Islamic l) -> [Month (Islamic l)]
enumFromTo :: Month (Islamic l) -> Month (Islamic l) -> [Month (Islamic l)]
$cenumFromThenTo :: forall (l :: LeapPattern).
Month (Islamic l)
-> Month (Islamic l) -> Month (Islamic l) -> [Month (Islamic l)]
enumFromThenTo :: Month (Islamic l)
-> Month (Islamic l) -> Month (Islamic l) -> [Month (Islamic l)]
Enum, Month (Islamic l)
Month (Islamic l)
-> Month (Islamic l) -> Bounded (Month (Islamic l))
forall a. a -> a -> Bounded a
forall (l :: LeapPattern). Month (Islamic l)
$cminBound :: forall (l :: LeapPattern). Month (Islamic l)
minBound :: Month (Islamic l)
$cmaxBound :: forall (l :: LeapPattern). Month (Islamic l)
maxBound :: Month (Islamic l)
Bounded)
fromDays :: Int32 -> Date (Islamic l)
fromDays = Int -> Int32 -> Date (Islamic l)
forall (l :: LeapPattern). Int -> Int32 -> Date (Islamic l)
islamicFromDays (forall (l :: LeapPattern). KnownLeap l => Int
leapPatternBits @l)
toDays :: Date (Islamic l) -> Int32
toDays = Date (Islamic l) -> Int32
forall (l :: LeapPattern). Date (Islamic l) -> Int32
islamicToDays
toYmd :: Date (Islamic l) -> (Int32, Word8, Word8)
toYmd = Date (Islamic l) -> (Int32, Word8, Word8)
forall (l :: LeapPattern).
Date (Islamic l) -> (Int32, Word8, Word8)
islamicToYmd
calendarName :: Date (Islamic l) -> String
calendarName Date (Islamic l)
_ = String
"Islamic"
day' :: Date (Islamic l) -> Int
day' (IslamicDate Int32
_ Word8
d Word8
_ Int32
_) = Word8 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word8
d
setDay' :: Int -> Date (Islamic l) -> Date (Islamic l)
setDay' = let b :: Int
b = forall (l :: LeapPattern). KnownLeap l => Int
leapPatternBits @l in Int
-> (Int -> Month (Islamic Any) -> Int -> Int)
-> (Int32 -> Date (Islamic l))
-> (Date (Islamic l) -> (Int32, Word8, Word8))
-> Int
-> Date (Islamic l)
-> Date (Islamic l)
forall mon d.
Enum mon =>
Int
-> (Int -> mon -> Int -> Int)
-> (Int32 -> d)
-> (d -> (Int32, Word8, Word8))
-> Int
-> d
-> d
mkCommonDaySetter Int
forall a. Integral a => a
invalidDayThresh (Int -> Int -> Month (Islamic Any) -> Int -> Int
forall (l :: LeapPattern).
Int -> Int -> Month (Islamic l) -> Int -> Int
yearMonthDayToDays Int
b) (Int -> Int32 -> Date (Islamic l)
forall (l :: LeapPattern). Int -> Int32 -> Date (Islamic l)
islamicFromDays Int
b) Date (Islamic l) -> (Int32, Word8, Word8)
forall (l :: LeapPattern).
Date (Islamic l) -> (Int32, Word8, Word8)
islamicToYmd
{-# INLINE day' #-}
month' :: Date (Islamic l) -> Month (Islamic l)
month' (IslamicDate Int32
_ Word8
_ Word8
m Int32
_) = Int -> Month (Islamic l)
forall a. Enum a => Int -> a
toEnum (Int -> Month (Islamic l))
-> (Word8 -> Int) -> Word8 -> Month (Islamic l)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word8 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word8 -> Month (Islamic l)) -> Word8 -> Month (Islamic l)
forall a b. (a -> b) -> a -> b
$ Word8
m
setMonthIndex' :: Int -> Date (Islamic l) -> Date (Islamic l)
setMonthIndex' = let b :: Int
b = forall (l :: LeapPattern). KnownLeap l => Int
leapPatternBits @l in Int
-> (Int, Int, Word8)
-> (Month (Islamic Any) -> Int -> Int)
-> (Int -> Month (Islamic Any) -> Int -> Int)
-> (Date (Islamic l) -> (Int32, Word8, Word8))
-> (Int32 -> Date (Islamic l))
-> Int
-> Date (Islamic l)
-> Date (Islamic l)
forall mon d.
Enum mon =>
Int
-> (Int, Int, Word8)
-> (mon -> Int -> Int)
-> (Int -> mon -> Int -> Int)
-> (d -> (Int32, Word8, Word8))
-> (Int32 -> d)
-> Int
-> d
-> d
mkCommonMonthSetter Int
monthsPerYear (Int, Int, Word8)
forall a b c. (Integral a, Integral b, Integral c) => (a, b, c)
firstIslDayTuple (Int -> Month (Islamic Any) -> Int -> Int
forall (l :: LeapPattern). Int -> Month (Islamic l) -> Int -> Int
maxDaysInMonth Int
b) (Int -> Int -> Month (Islamic Any) -> Int -> Int
forall (l :: LeapPattern).
Int -> Int -> Month (Islamic l) -> Int -> Int
yearMonthDayToDays Int
b) Date (Islamic l) -> (Int32, Word8, Word8)
forall (l :: LeapPattern).
Date (Islamic l) -> (Int32, Word8, Word8)
islamicToYmd (Int -> Int32 -> Date (Islamic l)
forall (l :: LeapPattern). Int -> Int32 -> Date (Islamic l)
islamicFromDays Int
b)
{-# INLINE month' #-}
year' :: Date (Islamic l) -> Int
year' (IslamicDate Int32
_ Word8
_ Word8
_ Int32
y) = Int32 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int32
y
setYear' :: Int -> Date (Islamic l) -> Date (Islamic l)
setYear' = let b :: Int
b = forall (l :: LeapPattern). KnownLeap l => Int
leapPatternBits @l in (Int, Word8, Word8)
-> (Month (Islamic Any) -> Int -> Int)
-> (Int -> Month (Islamic Any) -> Int -> Int)
-> (Date (Islamic l) -> (Int32, Word8, Word8))
-> (Int32 -> Date (Islamic l))
-> Int
-> Date (Islamic l)
-> Date (Islamic l)
forall mon d.
Enum mon =>
(Int, Word8, Word8)
-> (mon -> Int -> Int)
-> (Int -> mon -> Int -> Int)
-> (d -> (Int32, Word8, Word8))
-> (Int32 -> d)
-> Int
-> d
-> d
mkYearSetter (Int, Word8, Word8)
forall a b c. (Integral a, Integral b, Integral c) => (a, b, c)
firstIslDayTuple (Int -> Month (Islamic Any) -> Int -> Int
forall (l :: LeapPattern). Int -> Month (Islamic l) -> Int -> Int
maxDaysInMonth Int
b) (Int -> Int -> Month (Islamic Any) -> Int -> Int
forall (l :: LeapPattern).
Int -> Int -> Month (Islamic l) -> Int -> Int
yearMonthDayToDays Int
b) Date (Islamic l) -> (Int32, Word8, Word8)
forall (l :: LeapPattern).
Date (Islamic l) -> (Int32, Word8, Word8)
islamicToYmd (Int -> Int32 -> Date (Islamic l)
forall (l :: LeapPattern). Int -> Int32 -> Date (Islamic l)
islamicFromDays Int
b)
{-# INLINE year' #-}
dayOfWeek' :: Date (Islamic l) -> DayOfWeek (Islamic l)
dayOfWeek' (IslamicDate Int32
days Word8
_ Word8
_ Int32
_) = Int -> DayOfWeek (Islamic l)
forall a. Enum a => Int -> a
toEnum (Int -> DayOfWeek (Islamic l))
-> (Int32 -> Int) -> Int32 -> DayOfWeek (Islamic l)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DayOfWeek (Islamic Any) -> Int -> Int
forall dow. Enum dow => dow -> Int -> Int
dayOfWeekFromDays DayOfWeek (Islamic Any)
forall (l :: LeapPattern). DayOfWeek (Islamic l)
epochDayOfWeek (Int -> Int) -> (Int32 -> Int) -> Int32 -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int32 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int32 -> DayOfWeek (Islamic l)) -> Int32 -> DayOfWeek (Islamic l)
forall a b. (a -> b) -> a -> b
$ Int32
days
next' :: Int
-> DayOfWeek (Islamic l) -> Date (Islamic l) -> Date (Islamic l)
next' Int
n DayOfWeek (Islamic l)
dow (IslamicDate Int32
days Word8
_ Word8
_ Int32
_) = (Int32 -> Date (Islamic l))
-> DayOfWeek (Islamic l)
-> Int
-> DayOfWeek (Islamic l)
-> (Int -> Int -> Int)
-> (Int -> Int -> Int)
-> (Int -> Int -> Bool)
-> Int
-> Date (Islamic l)
forall dow d.
Enum dow =>
(Int32 -> d)
-> dow
-> Int
-> dow
-> (Int -> Int -> Int)
-> (Int -> Int -> Int)
-> (Int -> Int -> Bool)
-> Int
-> d
moveByDow (Int -> Int32 -> Date (Islamic l)
forall (l :: LeapPattern). Int -> Int32 -> Date (Islamic l)
islamicFromDays (forall (l :: LeapPattern). KnownLeap l => Int
leapPatternBits @l)) DayOfWeek (Islamic l)
forall (l :: LeapPattern). DayOfWeek (Islamic l)
epochDayOfWeek Int
n DayOfWeek (Islamic l)
dow (-) Int -> Int -> Int
forall a. Num a => a -> a -> a
(+) Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
(>) (Int32 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int32
days)
previous' :: Int
-> DayOfWeek (Islamic l) -> Date (Islamic l) -> Date (Islamic l)
previous' Int
n DayOfWeek (Islamic l)
dow (IslamicDate Int32
days Word8
_ Word8
_ Int32
_) = (Int32 -> Date (Islamic l))
-> DayOfWeek (Islamic l)
-> Int
-> DayOfWeek (Islamic l)
-> (Int -> Int -> Int)
-> (Int -> Int -> Int)
-> (Int -> Int -> Bool)
-> Int
-> Date (Islamic l)
forall dow d.
Enum dow =>
(Int32 -> d)
-> dow
-> Int
-> dow
-> (Int -> Int -> Int)
-> (Int -> Int -> Int)
-> (Int -> Int -> Bool)
-> Int
-> d
moveByDow (Int -> Int32 -> Date (Islamic l)
forall (l :: LeapPattern). Int -> Int32 -> Date (Islamic l)
islamicFromDays (forall (l :: LeapPattern). KnownLeap l => Int
leapPatternBits @l)) DayOfWeek (Islamic l)
forall (l :: LeapPattern). DayOfWeek (Islamic l)
epochDayOfWeek Int
n DayOfWeek (Islamic l)
dow Int -> Int -> Int
forall a. Num a => a -> a -> a
subtract (-) Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
(<) (Int32 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int32
days)
instance NFData (Date (Islamic l)) where
rnf :: Date (Islamic l) -> ()
rnf (IslamicDate Int32
days Word8
d Word8
m Int32
y) = Int32 -> ()
forall a. NFData a => a -> ()
rnf Int32
days () -> () -> ()
forall a b. a -> b -> b
`seq` Word8 -> ()
forall a. NFData a => a -> ()
rnf Word8
d () -> () -> ()
forall a b. a -> b -> b
`seq` Word8 -> ()
forall a. NFData a => a -> ()
rnf Word8
m () -> () -> ()
forall a b. a -> b -> b
`seq` Int32 -> ()
forall a. NFData a => a -> ()
rnf Int32
y
instance Hashable (Date (Islamic l)) where
hashWithSalt :: Int -> Date (Islamic l) -> Int
hashWithSalt Int
s (IslamicDate Int32
days Word8
d Word8
m Int32
y) = Int
s Int -> Int32 -> Int
forall a. Hashable a => Int -> a -> Int
`hashWithSalt` Int32
days Int -> Word8 -> Int
forall a. Hashable a => Int -> a -> Int
`hashWithSalt` Word8
d Int -> Word8 -> Int
forall a. Hashable a => Int -> a -> Int
`hashWithSalt` Word8
m Int -> Int32 -> Int
forall a. Hashable a => Int -> a -> Int
`hashWithSalt` Int32
y
instance NFData (Month (Islamic l)) where
rnf :: Month (Islamic l) -> ()
rnf Month (Islamic l)
m = Month (Islamic l)
m Month (Islamic l) -> () -> ()
forall a b. a -> b -> b
`seq` ()
instance Hashable (Month (Islamic l)) where
hashWithSalt :: Int -> Month (Islamic l) -> Int
hashWithSalt Int
s = Int -> Int -> Int
forall a. Hashable a => Int -> a -> Int
hashWithSalt Int
s (Int -> Int)
-> (Month (Islamic l) -> Int) -> Month (Islamic l) -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Month (Islamic l) -> Int
forall a. Enum a => a -> Int
fromEnum
instance NFData (DayOfWeek (Islamic l)) where
rnf :: DayOfWeek (Islamic l) -> ()
rnf DayOfWeek (Islamic l)
d = DayOfWeek (Islamic l)
d DayOfWeek (Islamic l) -> () -> ()
forall a b. a -> b -> b
`seq` ()
instance Hashable (DayOfWeek (Islamic l)) where
hashWithSalt :: Int -> DayOfWeek (Islamic l) -> Int
hashWithSalt Int
s = Int -> Int -> Int
forall a. Hashable a => Int -> a -> Int
hashWithSalt Int
s (Int -> Int)
-> (DayOfWeek (Islamic l) -> Int) -> DayOfWeek (Islamic l) -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DayOfWeek (Islamic l) -> Int
forall a. Enum a => a -> Int
fromEnum
instance KnownLeap l => IsCalendarDateTime (Islamic l) where
fromAdjustedInstant :: Instant -> CalendarDateTime (Islamic l)
fromAdjustedInstant (Instant Int32
days Word32
secs Word32
nsecs) = Date (Islamic l) -> LocalTime -> CalendarDateTime (Islamic l)
forall calendar.
Date calendar -> LocalTime -> CalendarDateTime calendar
CalendarDateTime (Int -> Int32 -> Date (Islamic l)
forall (l :: LeapPattern). Int -> Int32 -> Date (Islamic l)
islamicFromDays (forall (l :: LeapPattern). KnownLeap l => Int
leapPatternBits @l) Int32
days) (Word32 -> Word32 -> LocalTime
LocalTime Word32
secs Word32
nsecs)
toUnadjustedInstant :: CalendarDateTime (Islamic l) -> Instant
toUnadjustedInstant (CalendarDateTime Date (Islamic l)
isd (LocalTime Word32
secs Word32
nsecs)) = Int32 -> Word32 -> Word32 -> Instant
Instant (Date (Islamic l) -> Int32
forall (l :: LeapPattern). Date (Islamic l) -> Int32
islamicToDays Date (Islamic l)
isd) Word32
secs Word32
nsecs
islamicFromDays :: Int -> Int32 -> Date (Islamic l)
islamicFromDays :: forall (l :: LeapPattern). Int -> Int32 -> Date (Islamic l)
islamicFromDays Int
bits Int32
days = Int32 -> Word8 -> Word8 -> Int32 -> Date (Islamic l)
forall (l :: LeapPattern).
Int32 -> Word8 -> Word8 -> Int32 -> Date (Islamic l)
IslamicDate Int32
days Word8
d Word8
m Int32
y
where (Int32
y, Word8
m, Word8
d) = Int -> Int32 -> (Int32, Word8, Word8)
daysToYearMonthDay Int
bits Int32
days
islamicToDays :: Date (Islamic l) -> Int32
islamicToDays :: forall (l :: LeapPattern). Date (Islamic l) -> Int32
islamicToDays (IslamicDate Int32
days Word8
_ Word8
_ Int32
_) = Int32
days
islamicToYmd :: Date (Islamic l) -> (Int32, Word8, Word8)
islamicToYmd :: forall (l :: LeapPattern).
Date (Islamic l) -> (Int32, Word8, Word8)
islamicToYmd (IslamicDate Int32
_ Word8
d Word8
m Int32
y) = (Int32
y, Word8
m, Word8
d)
calendarDate :: DayOfMonth -> Month IslamicBcl -> Year -> Maybe (CalendarDate IslamicBcl)
calendarDate :: Int -> Month IslamicBcl -> Int -> Maybe (CalendarDate IslamicBcl)
calendarDate = Int -> Month IslamicBcl -> Int -> Maybe (CalendarDate IslamicBcl)
forall (l :: LeapPattern).
KnownLeap l =>
Int -> Month (Islamic l) -> Int -> Maybe (CalendarDate (Islamic l))
calendarDate'
calendarDate' :: forall l. KnownLeap l => DayOfMonth -> Month (Islamic l) -> Year -> Maybe (CalendarDate (Islamic l))
calendarDate' :: forall (l :: LeapPattern).
KnownLeap l =>
Int -> Month (Islamic l) -> Int -> Maybe (CalendarDate (Islamic l))
calendarDate' Int
d Month (Islamic l)
m Int
y = do
Bool -> Maybe ()
forall (f :: * -> *). Alternative f => Bool -> f ()
guard (Bool -> Maybe ()) -> Bool -> Maybe ()
forall a b. (a -> b) -> a -> b
$ Int
d Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
0 Bool -> Bool -> Bool
&& Int
d Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int -> Month (Islamic l) -> Int -> Int
forall (l :: LeapPattern). Int -> Month (Islamic l) -> Int -> Int
maxDaysInMonth Int
bits Month (Islamic l)
m Int
y
let days :: Int32
days = Int -> Int32
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Int32) -> Int -> Int32
forall a b. (a -> b) -> a -> b
$ Int -> Int -> Month (Islamic l) -> Int -> Int
forall (l :: LeapPattern).
Int -> Int -> Month (Islamic l) -> Int -> Int
yearMonthDayToDays Int
bits Int
y Month (Islamic l)
m Int
d
Bool -> Maybe ()
forall (f :: * -> *). Alternative f => Bool -> f ()
guard (Bool -> Maybe ()) -> Bool -> Maybe ()
forall a b. (a -> b) -> a -> b
$ Int32
days Int32 -> Int32 -> Bool
forall a. Ord a => a -> a -> Bool
> Int32
forall a. Integral a => a
invalidDayThresh
CalendarDate (Islamic l) -> Maybe (CalendarDate (Islamic l))
forall a. a -> Maybe a
forall (m :: * -> *) a. Monad m => a -> m a
return (CalendarDate (Islamic l) -> Maybe (CalendarDate (Islamic l)))
-> CalendarDate (Islamic l) -> Maybe (CalendarDate (Islamic l))
forall a b. (a -> b) -> a -> b
$ Int -> Int32 -> CalendarDate (Islamic l)
forall (l :: LeapPattern). Int -> Int32 -> Date (Islamic l)
islamicFromDays Int
bits Int32
days
where bits :: Int
bits = forall (l :: LeapPattern). KnownLeap l => Int
leapPatternBits @l
fromNthDay :: DayNth -> DayOfWeek IslamicBcl -> Month IslamicBcl -> Year -> Maybe (CalendarDate IslamicBcl)
fromNthDay :: DayNth
-> DayOfWeek IslamicBcl
-> Month IslamicBcl
-> Int
-> Maybe (CalendarDate IslamicBcl)
fromNthDay = DayNth
-> DayOfWeek IslamicBcl
-> Month IslamicBcl
-> Int
-> Maybe (CalendarDate IslamicBcl)
forall (l :: LeapPattern).
KnownLeap l =>
DayNth
-> DayOfWeek (Islamic l)
-> Month (Islamic l)
-> Int
-> Maybe (CalendarDate (Islamic l))
fromNthDay'
fromNthDay' :: forall l. KnownLeap l => DayNth -> DayOfWeek (Islamic l) -> Month (Islamic l) -> Year -> Maybe (CalendarDate (Islamic l))
fromNthDay' :: forall (l :: LeapPattern).
KnownLeap l =>
DayNth
-> DayOfWeek (Islamic l)
-> Month (Islamic l)
-> Int
-> Maybe (CalendarDate (Islamic l))
fromNthDay' = Int
-> DayOfWeek (Islamic l)
-> (Int -> Month (Islamic l) -> Int -> Int)
-> (Month (Islamic l) -> Int -> Int)
-> (Int32 -> CalendarDate (Islamic l))
-> DayNth
-> DayOfWeek (Islamic l)
-> Month (Islamic l)
-> Int
-> Maybe (CalendarDate (Islamic l))
forall mon dow d.
(Enum mon, Enum dow) =>
Int
-> dow
-> (Int -> mon -> Int -> Int)
-> (mon -> Int -> Int)
-> (Int32 -> d)
-> DayNth
-> dow
-> mon
-> Int
-> Maybe d
mkFromNthDay Int
forall a. Integral a => a
invalidDayThresh DayOfWeek (Islamic l)
forall (l :: LeapPattern). DayOfWeek (Islamic l)
epochDayOfWeek (Int -> Int -> Month (Islamic l) -> Int -> Int
forall (l :: LeapPattern).
Int -> Int -> Month (Islamic l) -> Int -> Int
yearMonthDayToDays Int
bits) (Int -> Month (Islamic l) -> Int -> Int
forall (l :: LeapPattern). Int -> Month (Islamic l) -> Int -> Int
maxDaysInMonth Int
bits) (Int -> Int32 -> CalendarDate (Islamic l)
forall (l :: LeapPattern). Int -> Int32 -> Date (Islamic l)
islamicFromDays Int
bits)
where bits :: Int
bits = forall (l :: LeapPattern). KnownLeap l => Int
leapPatternBits @l
fromWeekDate :: WeekNumber -> DayOfWeek IslamicBcl -> Year -> Maybe (CalendarDate IslamicBcl)
fromWeekDate :: Int
-> DayOfWeek IslamicBcl -> Int -> Maybe (CalendarDate IslamicBcl)
fromWeekDate = Int
-> DayOfWeek IslamicBcl -> Int -> Maybe (CalendarDate IslamicBcl)
forall (l :: LeapPattern).
KnownLeap l =>
Int
-> DayOfWeek (Islamic l) -> Int -> Maybe (CalendarDate (Islamic l))
fromWeekDate'
fromWeekDate' :: forall l. KnownLeap l => WeekNumber -> DayOfWeek (Islamic l) -> Year -> Maybe (CalendarDate (Islamic l))
fromWeekDate' :: forall (l :: LeapPattern).
KnownLeap l =>
Int
-> DayOfWeek (Islamic l) -> Int -> Maybe (CalendarDate (Islamic l))
fromWeekDate' = Int
-> DayOfWeek (Islamic l)
-> (Int -> Month (Islamic Any) -> Int -> Int)
-> (Int32 -> CalendarDate (Islamic l))
-> Int
-> DayOfWeek (Islamic l)
-> Int
-> DayOfWeek (Islamic l)
-> Int
-> Maybe (CalendarDate (Islamic l))
forall mon dow d.
(Enum mon, Enum dow) =>
Int
-> dow
-> (Int -> mon -> Int -> Int)
-> (Int32 -> d)
-> Int
-> dow
-> Int
-> dow
-> Int
-> Maybe d
mkFromWeekDate Int
forall a. Integral a => a
invalidDayThresh DayOfWeek (Islamic l)
forall (l :: LeapPattern). DayOfWeek (Islamic l)
epochDayOfWeek (Int -> Int -> Month (Islamic Any) -> Int -> Int
forall (l :: LeapPattern).
Int -> Int -> Month (Islamic l) -> Int -> Int
yearMonthDayToDays Int
bits) (Int -> Int32 -> CalendarDate (Islamic l)
forall (l :: LeapPattern). Int -> Int32 -> Date (Islamic l)
islamicFromDays Int
bits) Int
1 DayOfWeek (Islamic l)
forall (l :: LeapPattern). DayOfWeek (Islamic l)
Saturday
where bits :: Int
bits = forall (l :: LeapPattern). KnownLeap l => Int
leapPatternBits @l
isLeapYear :: Int -> Year -> Bool
isLeapYear :: Int -> Int -> Bool
isLeapYear Int
bits Int
y = Int -> Int -> Bool
forall a. Bits a => a -> Int -> Bool
testBit Int
bits (Int -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int
y Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
30))
maxDaysInMonth :: Int -> Month (Islamic l) -> Year -> Int
maxDaysInMonth :: forall (l :: LeapPattern). Int -> Month (Islamic l) -> Int -> Int
maxDaysInMonth Int
bits Month (Islamic l)
R:MonthIslamic l
DhulHijjah Int
y
| Int -> Int -> Bool
isLeapYear Int
bits Int
y = Int
30
| Bool
otherwise = Int
29
maxDaysInMonth Int
_ Month (Islamic l)
m Int
_
| Int -> Bool
forall a. Integral a => a -> Bool
even (Month (Islamic l) -> Int
forall a. Enum a => a -> Int
fromEnum Month (Islamic l)
m) = Int
30
| Bool
otherwise = Int
29
leapsInFirst :: Int -> Int -> Int
leapsInFirst :: Int -> Int -> Int
leapsInFirst Int
bits Int
r = Int -> Int
forall a. Bits a => a -> Int
popCount (Int
bits Int -> Int -> Int
forall a. Bits a => a -> a -> a
.&. ((Int
1 Int -> Int -> Int
forall a. Bits a => a -> Int -> a
`shiftL` (Int
r Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)) Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
2))
yearMonthDayToDays :: Int -> Year -> Month (Islamic l) -> DayOfMonth -> Int
yearMonthDayToDays :: forall (l :: LeapPattern).
Int -> Int -> Month (Islamic l) -> Int -> Int
yearMonthDayToDays Int
bits Int
y Month (Islamic l)
m Int
d = Int
islamicEpoch Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
daysBeforeYear Int -> Int -> Int
forall a. Num a => a -> a -> a
+ [Int]
islamicMonthDayOffsets [Int] -> Int -> Int
forall a. HasCallStack => [a] -> Int -> a
!! Month (Islamic l) -> Int
forall a. Enum a => a -> Int
fromEnum Month (Islamic l)
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
d Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1
where
(Int
c, Int
r) = (Int -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
y Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) Int -> Int -> (Int, Int)
forall a. Integral a => a -> a -> (a, a)
`divMod` Int
30
daysBeforeYear :: Int
daysBeforeYear = Int
c Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
daysPerCycle Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
r Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
daysPerNonLeapYear Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int -> Int -> Int
leapsInFirst Int
bits Int
r
daysToYearMonthDay :: Int -> Int32 -> (Int32, Word8, Word8)
daysToYearMonthDay :: Int -> Int32 -> (Int32, Word8, Word8)
daysToYearMonthDay Int
bits Int32
flatDays = (Int -> Int32
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
y, Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
m, Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
d)
where
n :: Int
n = Int32 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int32
flatDays Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
islamicEpoch
(Int
cycles, Int
remCycle) = Int
n Int -> Int -> (Int, Int)
forall a. Integral a => a -> a -> (a, a)
`divMod` Int
daysPerCycle
(Int
yearInCycle, Int
dayOfYear) = Int -> Int -> (Int, Int)
findYear Int
0 Int
0
y :: Int
y = Int
cycles Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
30 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
yearInCycle Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1
(Int
m, Int
d)
| Int
dayOfYear Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
daysPerNonLeapYear = (Int
11, Int
30)
| Bool
otherwise = (Int
dayOfYear Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
2 Int -> Int -> Int
forall a. Integral a => a -> a -> a
`div` Int
59, (Int
dayOfYear Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
59) Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
30 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)
findYear :: Int -> Int -> (Int, Int)
findYear Int
i Int
acc
| Int
acc Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
diy Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
remCycle = (Int
i, Int
remCycle Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
acc)
| Bool
otherwise = Int -> Int -> (Int, Int)
findYear (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) (Int
acc Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
diy)
where diy :: Int
diy = if Int -> Int -> Bool
forall a. Bits a => a -> Int -> Bool
testBit Int
bits ((Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
30) then Int
daysPerLeapYear else Int
daysPerNonLeapYear