{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE AllowAmbiguousTypes #-}
module Data.HodaTime.Calendar.Hebrew
(
calendarDate
,fromNthDay
,fromWeekDate
,calendarDate'
,fromNthDay'
,fromWeekDate'
,Hebrew
,MonthNumbering(..)
,Month(..)
,DayOfWeek(..)
,KnownNumbering
,HebrewCivil
,HebrewScriptural
)
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 (mkFromNthDay, moveByDow, dayOfWeekFromDays)
import Data.Int (Int32)
import Data.List (elemIndex)
import Data.Maybe (fromJust)
import Data.Word (Word8)
import Control.Monad (guard)
data MonthNumbering = Civil | Scriptural
data Hebrew (n :: MonthNumbering)
type HebrewCivil = Hebrew 'Civil
type HebrewScriptural = Hebrew 'Scriptural
class KnownNumbering (n :: MonthNumbering) where
numberingStart :: Int
instance KnownNumbering 'Civil where numberingStart :: Int
numberingStart = Int
0
instance KnownNumbering 'Scriptural where numberingStart :: Int
numberingStart = Int
7
instance KnownNumbering n => IsCalendar (Hebrew n) where
data Date (Hebrew n) = HebrewDate {-# UNPACK #-} !Int32 {-# UNPACK #-} !Word8 {-# UNPACK #-} !Word8 {-# UNPACK #-} !Int32
deriving (Date (Hebrew n) -> Date (Hebrew n) -> Bool
(Date (Hebrew n) -> Date (Hebrew n) -> Bool)
-> (Date (Hebrew n) -> Date (Hebrew n) -> Bool)
-> Eq (Date (Hebrew n))
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall (n :: MonthNumbering).
Date (Hebrew n) -> Date (Hebrew n) -> Bool
$c== :: forall (n :: MonthNumbering).
Date (Hebrew n) -> Date (Hebrew n) -> Bool
== :: Date (Hebrew n) -> Date (Hebrew n) -> Bool
$c/= :: forall (n :: MonthNumbering).
Date (Hebrew n) -> Date (Hebrew n) -> Bool
/= :: Date (Hebrew n) -> Date (Hebrew n) -> Bool
Eq, Eq (Date (Hebrew n))
Eq (Date (Hebrew n)) =>
(Date (Hebrew n) -> Date (Hebrew n) -> Ordering)
-> (Date (Hebrew n) -> Date (Hebrew n) -> Bool)
-> (Date (Hebrew n) -> Date (Hebrew n) -> Bool)
-> (Date (Hebrew n) -> Date (Hebrew n) -> Bool)
-> (Date (Hebrew n) -> Date (Hebrew n) -> Bool)
-> (Date (Hebrew n) -> Date (Hebrew n) -> Date (Hebrew n))
-> (Date (Hebrew n) -> Date (Hebrew n) -> Date (Hebrew n))
-> Ord (Date (Hebrew n))
Date (Hebrew n) -> Date (Hebrew n) -> Bool
Date (Hebrew n) -> Date (Hebrew n) -> Ordering
Date (Hebrew n) -> Date (Hebrew n) -> Date (Hebrew n)
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 (n :: MonthNumbering). Eq (Date (Hebrew n))
forall (n :: MonthNumbering).
Date (Hebrew n) -> Date (Hebrew n) -> Bool
forall (n :: MonthNumbering).
Date (Hebrew n) -> Date (Hebrew n) -> Ordering
forall (n :: MonthNumbering).
Date (Hebrew n) -> Date (Hebrew n) -> Date (Hebrew n)
$ccompare :: forall (n :: MonthNumbering).
Date (Hebrew n) -> Date (Hebrew n) -> Ordering
compare :: Date (Hebrew n) -> Date (Hebrew n) -> Ordering
$c< :: forall (n :: MonthNumbering).
Date (Hebrew n) -> Date (Hebrew n) -> Bool
< :: Date (Hebrew n) -> Date (Hebrew n) -> Bool
$c<= :: forall (n :: MonthNumbering).
Date (Hebrew n) -> Date (Hebrew n) -> Bool
<= :: Date (Hebrew n) -> Date (Hebrew n) -> Bool
$c> :: forall (n :: MonthNumbering).
Date (Hebrew n) -> Date (Hebrew n) -> Bool
> :: Date (Hebrew n) -> Date (Hebrew n) -> Bool
$c>= :: forall (n :: MonthNumbering).
Date (Hebrew n) -> Date (Hebrew n) -> Bool
>= :: Date (Hebrew n) -> Date (Hebrew n) -> Bool
$cmax :: forall (n :: MonthNumbering).
Date (Hebrew n) -> Date (Hebrew n) -> Date (Hebrew n)
max :: Date (Hebrew n) -> Date (Hebrew n) -> Date (Hebrew n)
$cmin :: forall (n :: MonthNumbering).
Date (Hebrew n) -> Date (Hebrew n) -> Date (Hebrew n)
min :: Date (Hebrew n) -> Date (Hebrew n) -> Date (Hebrew n)
Ord)
data Month (Hebrew n) =
Tishri | Cheshvan | Kislev | Tevet | Shevat | AdarI | Adar | Nisan | Iyar | Sivan | Tammuz | Av | Elul
deriving (Int -> Month (Hebrew n) -> ShowS
[Month (Hebrew n)] -> ShowS
Month (Hebrew n) -> String
(Int -> Month (Hebrew n) -> ShowS)
-> (Month (Hebrew n) -> String)
-> ([Month (Hebrew n)] -> ShowS)
-> Show (Month (Hebrew n))
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall (n :: MonthNumbering). Int -> Month (Hebrew n) -> ShowS
forall (n :: MonthNumbering). [Month (Hebrew n)] -> ShowS
forall (n :: MonthNumbering). Month (Hebrew n) -> String
$cshowsPrec :: forall (n :: MonthNumbering). Int -> Month (Hebrew n) -> ShowS
showsPrec :: Int -> Month (Hebrew n) -> ShowS
$cshow :: forall (n :: MonthNumbering). Month (Hebrew n) -> String
show :: Month (Hebrew n) -> String
$cshowList :: forall (n :: MonthNumbering). [Month (Hebrew n)] -> ShowS
showList :: [Month (Hebrew n)] -> ShowS
Show, ReadPrec [Month (Hebrew n)]
ReadPrec (Month (Hebrew n))
Int -> ReadS (Month (Hebrew n))
ReadS [Month (Hebrew n)]
(Int -> ReadS (Month (Hebrew n)))
-> ReadS [Month (Hebrew n)]
-> ReadPrec (Month (Hebrew n))
-> ReadPrec [Month (Hebrew n)]
-> Read (Month (Hebrew n))
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
forall (n :: MonthNumbering). ReadPrec [Month (Hebrew n)]
forall (n :: MonthNumbering). ReadPrec (Month (Hebrew n))
forall (n :: MonthNumbering). Int -> ReadS (Month (Hebrew n))
forall (n :: MonthNumbering). ReadS [Month (Hebrew n)]
$creadsPrec :: forall (n :: MonthNumbering). Int -> ReadS (Month (Hebrew n))
readsPrec :: Int -> ReadS (Month (Hebrew n))
$creadList :: forall (n :: MonthNumbering). ReadS [Month (Hebrew n)]
readList :: ReadS [Month (Hebrew n)]
$creadPrec :: forall (n :: MonthNumbering). ReadPrec (Month (Hebrew n))
readPrec :: ReadPrec (Month (Hebrew n))
$creadListPrec :: forall (n :: MonthNumbering). ReadPrec [Month (Hebrew n)]
readListPrec :: ReadPrec [Month (Hebrew n)]
Read, Month (Hebrew n) -> Month (Hebrew n) -> Bool
(Month (Hebrew n) -> Month (Hebrew n) -> Bool)
-> (Month (Hebrew n) -> Month (Hebrew n) -> Bool)
-> Eq (Month (Hebrew n))
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall (n :: MonthNumbering).
Month (Hebrew n) -> Month (Hebrew n) -> Bool
$c== :: forall (n :: MonthNumbering).
Month (Hebrew n) -> Month (Hebrew n) -> Bool
== :: Month (Hebrew n) -> Month (Hebrew n) -> Bool
$c/= :: forall (n :: MonthNumbering).
Month (Hebrew n) -> Month (Hebrew n) -> Bool
/= :: Month (Hebrew n) -> Month (Hebrew n) -> Bool
Eq, Eq (Month (Hebrew n))
Eq (Month (Hebrew n)) =>
(Month (Hebrew n) -> Month (Hebrew n) -> Ordering)
-> (Month (Hebrew n) -> Month (Hebrew n) -> Bool)
-> (Month (Hebrew n) -> Month (Hebrew n) -> Bool)
-> (Month (Hebrew n) -> Month (Hebrew n) -> Bool)
-> (Month (Hebrew n) -> Month (Hebrew n) -> Bool)
-> (Month (Hebrew n) -> Month (Hebrew n) -> Month (Hebrew n))
-> (Month (Hebrew n) -> Month (Hebrew n) -> Month (Hebrew n))
-> Ord (Month (Hebrew n))
Month (Hebrew n) -> Month (Hebrew n) -> Bool
Month (Hebrew n) -> Month (Hebrew n) -> Ordering
Month (Hebrew n) -> Month (Hebrew n) -> Month (Hebrew n)
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 (n :: MonthNumbering). Eq (Month (Hebrew n))
forall (n :: MonthNumbering).
Month (Hebrew n) -> Month (Hebrew n) -> Bool
forall (n :: MonthNumbering).
Month (Hebrew n) -> Month (Hebrew n) -> Ordering
forall (n :: MonthNumbering).
Month (Hebrew n) -> Month (Hebrew n) -> Month (Hebrew n)
$ccompare :: forall (n :: MonthNumbering).
Month (Hebrew n) -> Month (Hebrew n) -> Ordering
compare :: Month (Hebrew n) -> Month (Hebrew n) -> Ordering
$c< :: forall (n :: MonthNumbering).
Month (Hebrew n) -> Month (Hebrew n) -> Bool
< :: Month (Hebrew n) -> Month (Hebrew n) -> Bool
$c<= :: forall (n :: MonthNumbering).
Month (Hebrew n) -> Month (Hebrew n) -> Bool
<= :: Month (Hebrew n) -> Month (Hebrew n) -> Bool
$c> :: forall (n :: MonthNumbering).
Month (Hebrew n) -> Month (Hebrew n) -> Bool
> :: Month (Hebrew n) -> Month (Hebrew n) -> Bool
$c>= :: forall (n :: MonthNumbering).
Month (Hebrew n) -> Month (Hebrew n) -> Bool
>= :: Month (Hebrew n) -> Month (Hebrew n) -> Bool
$cmax :: forall (n :: MonthNumbering).
Month (Hebrew n) -> Month (Hebrew n) -> Month (Hebrew n)
max :: Month (Hebrew n) -> Month (Hebrew n) -> Month (Hebrew n)
$cmin :: forall (n :: MonthNumbering).
Month (Hebrew n) -> Month (Hebrew n) -> Month (Hebrew n)
min :: Month (Hebrew n) -> Month (Hebrew n) -> Month (Hebrew n)
Ord, Month (Hebrew n)
Month (Hebrew n) -> Month (Hebrew n) -> Bounded (Month (Hebrew n))
forall a. a -> a -> Bounded a
forall (n :: MonthNumbering). Month (Hebrew n)
$cminBound :: forall (n :: MonthNumbering). Month (Hebrew n)
minBound :: Month (Hebrew n)
$cmaxBound :: forall (n :: MonthNumbering). Month (Hebrew n)
maxBound :: Month (Hebrew n)
Bounded)
data DayOfWeek (Hebrew n) = Sunday | Monday | Tuesday | Wednesday | Thursday | Friday | Saturday
deriving (Int -> DayOfWeek (Hebrew n) -> ShowS
[DayOfWeek (Hebrew n)] -> ShowS
DayOfWeek (Hebrew n) -> String
(Int -> DayOfWeek (Hebrew n) -> ShowS)
-> (DayOfWeek (Hebrew n) -> String)
-> ([DayOfWeek (Hebrew n)] -> ShowS)
-> Show (DayOfWeek (Hebrew n))
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall (n :: MonthNumbering). Int -> DayOfWeek (Hebrew n) -> ShowS
forall (n :: MonthNumbering). [DayOfWeek (Hebrew n)] -> ShowS
forall (n :: MonthNumbering). DayOfWeek (Hebrew n) -> String
$cshowsPrec :: forall (n :: MonthNumbering). Int -> DayOfWeek (Hebrew n) -> ShowS
showsPrec :: Int -> DayOfWeek (Hebrew n) -> ShowS
$cshow :: forall (n :: MonthNumbering). DayOfWeek (Hebrew n) -> String
show :: DayOfWeek (Hebrew n) -> String
$cshowList :: forall (n :: MonthNumbering). [DayOfWeek (Hebrew n)] -> ShowS
showList :: [DayOfWeek (Hebrew n)] -> ShowS
Show, ReadPrec [DayOfWeek (Hebrew n)]
ReadPrec (DayOfWeek (Hebrew n))
Int -> ReadS (DayOfWeek (Hebrew n))
ReadS [DayOfWeek (Hebrew n)]
(Int -> ReadS (DayOfWeek (Hebrew n)))
-> ReadS [DayOfWeek (Hebrew n)]
-> ReadPrec (DayOfWeek (Hebrew n))
-> ReadPrec [DayOfWeek (Hebrew n)]
-> Read (DayOfWeek (Hebrew n))
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
forall (n :: MonthNumbering). ReadPrec [DayOfWeek (Hebrew n)]
forall (n :: MonthNumbering). ReadPrec (DayOfWeek (Hebrew n))
forall (n :: MonthNumbering). Int -> ReadS (DayOfWeek (Hebrew n))
forall (n :: MonthNumbering). ReadS [DayOfWeek (Hebrew n)]
$creadsPrec :: forall (n :: MonthNumbering). Int -> ReadS (DayOfWeek (Hebrew n))
readsPrec :: Int -> ReadS (DayOfWeek (Hebrew n))
$creadList :: forall (n :: MonthNumbering). ReadS [DayOfWeek (Hebrew n)]
readList :: ReadS [DayOfWeek (Hebrew n)]
$creadPrec :: forall (n :: MonthNumbering). ReadPrec (DayOfWeek (Hebrew n))
readPrec :: ReadPrec (DayOfWeek (Hebrew n))
$creadListPrec :: forall (n :: MonthNumbering). ReadPrec [DayOfWeek (Hebrew n)]
readListPrec :: ReadPrec [DayOfWeek (Hebrew n)]
Read, DayOfWeek (Hebrew n) -> DayOfWeek (Hebrew n) -> Bool
(DayOfWeek (Hebrew n) -> DayOfWeek (Hebrew n) -> Bool)
-> (DayOfWeek (Hebrew n) -> DayOfWeek (Hebrew n) -> Bool)
-> Eq (DayOfWeek (Hebrew n))
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall (n :: MonthNumbering).
DayOfWeek (Hebrew n) -> DayOfWeek (Hebrew n) -> Bool
$c== :: forall (n :: MonthNumbering).
DayOfWeek (Hebrew n) -> DayOfWeek (Hebrew n) -> Bool
== :: DayOfWeek (Hebrew n) -> DayOfWeek (Hebrew n) -> Bool
$c/= :: forall (n :: MonthNumbering).
DayOfWeek (Hebrew n) -> DayOfWeek (Hebrew n) -> Bool
/= :: DayOfWeek (Hebrew n) -> DayOfWeek (Hebrew n) -> Bool
Eq, Eq (DayOfWeek (Hebrew n))
Eq (DayOfWeek (Hebrew n)) =>
(DayOfWeek (Hebrew n) -> DayOfWeek (Hebrew n) -> Ordering)
-> (DayOfWeek (Hebrew n) -> DayOfWeek (Hebrew n) -> Bool)
-> (DayOfWeek (Hebrew n) -> DayOfWeek (Hebrew n) -> Bool)
-> (DayOfWeek (Hebrew n) -> DayOfWeek (Hebrew n) -> Bool)
-> (DayOfWeek (Hebrew n) -> DayOfWeek (Hebrew n) -> Bool)
-> (DayOfWeek (Hebrew n)
-> DayOfWeek (Hebrew n) -> DayOfWeek (Hebrew n))
-> (DayOfWeek (Hebrew n)
-> DayOfWeek (Hebrew n) -> DayOfWeek (Hebrew n))
-> Ord (DayOfWeek (Hebrew n))
DayOfWeek (Hebrew n) -> DayOfWeek (Hebrew n) -> Bool
DayOfWeek (Hebrew n) -> DayOfWeek (Hebrew n) -> Ordering
DayOfWeek (Hebrew n)
-> DayOfWeek (Hebrew n) -> DayOfWeek (Hebrew n)
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 (n :: MonthNumbering). Eq (DayOfWeek (Hebrew n))
forall (n :: MonthNumbering).
DayOfWeek (Hebrew n) -> DayOfWeek (Hebrew n) -> Bool
forall (n :: MonthNumbering).
DayOfWeek (Hebrew n) -> DayOfWeek (Hebrew n) -> Ordering
forall (n :: MonthNumbering).
DayOfWeek (Hebrew n)
-> DayOfWeek (Hebrew n) -> DayOfWeek (Hebrew n)
$ccompare :: forall (n :: MonthNumbering).
DayOfWeek (Hebrew n) -> DayOfWeek (Hebrew n) -> Ordering
compare :: DayOfWeek (Hebrew n) -> DayOfWeek (Hebrew n) -> Ordering
$c< :: forall (n :: MonthNumbering).
DayOfWeek (Hebrew n) -> DayOfWeek (Hebrew n) -> Bool
< :: DayOfWeek (Hebrew n) -> DayOfWeek (Hebrew n) -> Bool
$c<= :: forall (n :: MonthNumbering).
DayOfWeek (Hebrew n) -> DayOfWeek (Hebrew n) -> Bool
<= :: DayOfWeek (Hebrew n) -> DayOfWeek (Hebrew n) -> Bool
$c> :: forall (n :: MonthNumbering).
DayOfWeek (Hebrew n) -> DayOfWeek (Hebrew n) -> Bool
> :: DayOfWeek (Hebrew n) -> DayOfWeek (Hebrew n) -> Bool
$c>= :: forall (n :: MonthNumbering).
DayOfWeek (Hebrew n) -> DayOfWeek (Hebrew n) -> Bool
>= :: DayOfWeek (Hebrew n) -> DayOfWeek (Hebrew n) -> Bool
$cmax :: forall (n :: MonthNumbering).
DayOfWeek (Hebrew n)
-> DayOfWeek (Hebrew n) -> DayOfWeek (Hebrew n)
max :: DayOfWeek (Hebrew n)
-> DayOfWeek (Hebrew n) -> DayOfWeek (Hebrew n)
$cmin :: forall (n :: MonthNumbering).
DayOfWeek (Hebrew n)
-> DayOfWeek (Hebrew n) -> DayOfWeek (Hebrew n)
min :: DayOfWeek (Hebrew n)
-> DayOfWeek (Hebrew n) -> DayOfWeek (Hebrew n)
Ord, Int -> DayOfWeek (Hebrew n)
DayOfWeek (Hebrew n) -> Int
DayOfWeek (Hebrew n) -> [DayOfWeek (Hebrew n)]
DayOfWeek (Hebrew n) -> DayOfWeek (Hebrew n)
DayOfWeek (Hebrew n)
-> DayOfWeek (Hebrew n) -> [DayOfWeek (Hebrew n)]
DayOfWeek (Hebrew n)
-> DayOfWeek (Hebrew n)
-> DayOfWeek (Hebrew n)
-> [DayOfWeek (Hebrew n)]
(DayOfWeek (Hebrew n) -> DayOfWeek (Hebrew n))
-> (DayOfWeek (Hebrew n) -> DayOfWeek (Hebrew n))
-> (Int -> DayOfWeek (Hebrew n))
-> (DayOfWeek (Hebrew n) -> Int)
-> (DayOfWeek (Hebrew n) -> [DayOfWeek (Hebrew n)])
-> (DayOfWeek (Hebrew n)
-> DayOfWeek (Hebrew n) -> [DayOfWeek (Hebrew n)])
-> (DayOfWeek (Hebrew n)
-> DayOfWeek (Hebrew n) -> [DayOfWeek (Hebrew n)])
-> (DayOfWeek (Hebrew n)
-> DayOfWeek (Hebrew n)
-> DayOfWeek (Hebrew n)
-> [DayOfWeek (Hebrew n)])
-> Enum (DayOfWeek (Hebrew n))
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 (n :: MonthNumbering). Int -> DayOfWeek (Hebrew n)
forall (n :: MonthNumbering). DayOfWeek (Hebrew n) -> Int
forall (n :: MonthNumbering).
DayOfWeek (Hebrew n) -> [DayOfWeek (Hebrew n)]
forall (n :: MonthNumbering).
DayOfWeek (Hebrew n) -> DayOfWeek (Hebrew n)
forall (n :: MonthNumbering).
DayOfWeek (Hebrew n)
-> DayOfWeek (Hebrew n) -> [DayOfWeek (Hebrew n)]
forall (n :: MonthNumbering).
DayOfWeek (Hebrew n)
-> DayOfWeek (Hebrew n)
-> DayOfWeek (Hebrew n)
-> [DayOfWeek (Hebrew n)]
$csucc :: forall (n :: MonthNumbering).
DayOfWeek (Hebrew n) -> DayOfWeek (Hebrew n)
succ :: DayOfWeek (Hebrew n) -> DayOfWeek (Hebrew n)
$cpred :: forall (n :: MonthNumbering).
DayOfWeek (Hebrew n) -> DayOfWeek (Hebrew n)
pred :: DayOfWeek (Hebrew n) -> DayOfWeek (Hebrew n)
$ctoEnum :: forall (n :: MonthNumbering). Int -> DayOfWeek (Hebrew n)
toEnum :: Int -> DayOfWeek (Hebrew n)
$cfromEnum :: forall (n :: MonthNumbering). DayOfWeek (Hebrew n) -> Int
fromEnum :: DayOfWeek (Hebrew n) -> Int
$cenumFrom :: forall (n :: MonthNumbering).
DayOfWeek (Hebrew n) -> [DayOfWeek (Hebrew n)]
enumFrom :: DayOfWeek (Hebrew n) -> [DayOfWeek (Hebrew n)]
$cenumFromThen :: forall (n :: MonthNumbering).
DayOfWeek (Hebrew n)
-> DayOfWeek (Hebrew n) -> [DayOfWeek (Hebrew n)]
enumFromThen :: DayOfWeek (Hebrew n)
-> DayOfWeek (Hebrew n) -> [DayOfWeek (Hebrew n)]
$cenumFromTo :: forall (n :: MonthNumbering).
DayOfWeek (Hebrew n)
-> DayOfWeek (Hebrew n) -> [DayOfWeek (Hebrew n)]
enumFromTo :: DayOfWeek (Hebrew n)
-> DayOfWeek (Hebrew n) -> [DayOfWeek (Hebrew n)]
$cenumFromThenTo :: forall (n :: MonthNumbering).
DayOfWeek (Hebrew n)
-> DayOfWeek (Hebrew n)
-> DayOfWeek (Hebrew n)
-> [DayOfWeek (Hebrew n)]
enumFromThenTo :: DayOfWeek (Hebrew n)
-> DayOfWeek (Hebrew n)
-> DayOfWeek (Hebrew n)
-> [DayOfWeek (Hebrew n)]
Enum, DayOfWeek (Hebrew n)
DayOfWeek (Hebrew n)
-> DayOfWeek (Hebrew n) -> Bounded (DayOfWeek (Hebrew n))
forall a. a -> a -> Bounded a
forall (n :: MonthNumbering). DayOfWeek (Hebrew n)
$cminBound :: forall (n :: MonthNumbering). DayOfWeek (Hebrew n)
minBound :: DayOfWeek (Hebrew n)
$cmaxBound :: forall (n :: MonthNumbering). DayOfWeek (Hebrew n)
maxBound :: DayOfWeek (Hebrew n)
Bounded)
fromDays :: Int32 -> Date (Hebrew n)
fromDays = Int32 -> Date (Hebrew n)
forall (n :: MonthNumbering). Int32 -> Date (Hebrew n)
hebrewFromDays
toDays :: Date (Hebrew n) -> Int32
toDays = Date (Hebrew n) -> Int32
forall (n :: MonthNumbering). Date (Hebrew n) -> Int32
hebrewToDays
toYmd :: Date (Hebrew n) -> (Int32, Word8, Word8)
toYmd = Date (Hebrew n) -> (Int32, Word8, Word8)
forall (n :: MonthNumbering).
Date (Hebrew n) -> (Int32, Word8, Word8)
hebrewToYmd
calendarName :: Date (Hebrew n) -> String
calendarName Date (Hebrew n)
_ = String
"Hebrew"
day' :: Date (Hebrew n) -> Int
day' (HebrewDate Int32
_ Word8
d Word8
_ Int32
_) = Word8 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word8
d
setDay' :: Int -> Date (Hebrew n) -> Date (Hebrew n)
setDay' = Int -> Date (Hebrew n) -> Date (Hebrew n)
forall (n :: MonthNumbering).
Int -> Date (Hebrew n) -> Date (Hebrew n)
setHebrewDay
{-# INLINE day' #-}
month' :: Date (Hebrew n) -> Month (Hebrew n)
month' (HebrewDate Int32
_ Word8
_ Word8
ci Int32
_) = Int -> Month (Hebrew n)
forall (n :: MonthNumbering). Int -> Month (Hebrew n)
monthAt (Word8 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word8
ci)
setMonthIndex' :: Int -> Date (Hebrew n) -> Date (Hebrew n)
setMonthIndex' = Int -> Int -> Date (Hebrew n) -> Date (Hebrew n)
forall (n :: MonthNumbering).
Int -> Int -> Date (Hebrew n) -> Date (Hebrew n)
setHebrewMonth (forall (n :: MonthNumbering). KnownNumbering n => Int
numberingStart @n)
{-# INLINE month' #-}
year' :: Date (Hebrew n) -> Int
year' (HebrewDate Int32
_ Word8
_ Word8
_ Int32
y) = Int32 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int32
y
setYear' :: Int -> Date (Hebrew n) -> Date (Hebrew n)
setYear' = Int -> Date (Hebrew n) -> Date (Hebrew n)
forall (n :: MonthNumbering).
Int -> Date (Hebrew n) -> Date (Hebrew n)
setHebrewYear
{-# INLINE year' #-}
dayOfWeek' :: Date (Hebrew n) -> DayOfWeek (Hebrew n)
dayOfWeek' (HebrewDate Int32
days Word8
_ Word8
_ Int32
_) = Int -> DayOfWeek (Hebrew n)
forall a. Enum a => Int -> a
toEnum (Int -> DayOfWeek (Hebrew n))
-> (Int32 -> Int) -> Int32 -> DayOfWeek (Hebrew n)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DayOfWeek (Hebrew Any) -> Int -> Int
forall dow. Enum dow => dow -> Int -> Int
dayOfWeekFromDays DayOfWeek (Hebrew Any)
forall (n :: MonthNumbering). DayOfWeek (Hebrew n)
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 (Hebrew n)) -> Int32 -> DayOfWeek (Hebrew n)
forall a b. (a -> b) -> a -> b
$ Int32
days
next' :: Int -> DayOfWeek (Hebrew n) -> Date (Hebrew n) -> Date (Hebrew n)
next' Int
i DayOfWeek (Hebrew n)
dow (HebrewDate Int32
days Word8
_ Word8
_ Int32
_) = (Int32 -> Date (Hebrew n))
-> DayOfWeek (Hebrew n)
-> Int
-> DayOfWeek (Hebrew n)
-> (Int -> Int -> Int)
-> (Int -> Int -> Int)
-> (Int -> Int -> Bool)
-> Int
-> Date (Hebrew n)
forall dow d.
Enum dow =>
(Int32 -> d)
-> dow
-> Int
-> dow
-> (Int -> Int -> Int)
-> (Int -> Int -> Int)
-> (Int -> Int -> Bool)
-> Int
-> d
moveByDow Int32 -> Date (Hebrew n)
forall (n :: MonthNumbering). Int32 -> Date (Hebrew n)
hebrewFromDays DayOfWeek (Hebrew n)
forall (n :: MonthNumbering). DayOfWeek (Hebrew n)
epochDayOfWeek Int
i DayOfWeek (Hebrew n)
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 (Hebrew n) -> Date (Hebrew n) -> Date (Hebrew n)
previous' Int
i DayOfWeek (Hebrew n)
dow (HebrewDate Int32
days Word8
_ Word8
_ Int32
_) = (Int32 -> Date (Hebrew n))
-> DayOfWeek (Hebrew n)
-> Int
-> DayOfWeek (Hebrew n)
-> (Int -> Int -> Int)
-> (Int -> Int -> Int)
-> (Int -> Int -> Bool)
-> Int
-> Date (Hebrew n)
forall dow d.
Enum dow =>
(Int32 -> d)
-> dow
-> Int
-> dow
-> (Int -> Int -> Int)
-> (Int -> Int -> Int)
-> (Int -> Int -> Bool)
-> Int
-> d
moveByDow Int32 -> Date (Hebrew n)
forall (n :: MonthNumbering). Int32 -> Date (Hebrew n)
hebrewFromDays DayOfWeek (Hebrew n)
forall (n :: MonthNumbering). DayOfWeek (Hebrew n)
epochDayOfWeek Int
i DayOfWeek (Hebrew n)
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 KnownNumbering n => Enum (Month (Hebrew n)) where
fromEnum :: Month (Hebrew n) -> Int
fromEnum Month (Hebrew n)
m = (Month (Hebrew n) -> Int
forall (n :: MonthNumbering). Month (Hebrew n) -> Int
calendarIndex Month (Hebrew n)
m Int -> Int -> Int
forall a. Num a => a -> a -> a
- forall (n :: MonthNumbering). KnownNumbering n => Int
numberingStart @n) Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
monthCount
toEnum :: Int -> Month (Hebrew n)
toEnum Int
i
| Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
0 Bool -> Bool -> Bool
&& Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
monthCount = Int -> Month (Hebrew n)
forall (n :: MonthNumbering). Int -> Month (Hebrew n)
monthAt ((Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ forall (n :: MonthNumbering). KnownNumbering n => Int
numberingStart @n) Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
monthCount)
| Bool
otherwise = String -> Month (Hebrew n)
forall a. HasCallStack => String -> a
error String
"Data.HodaTime.Calendar.Hebrew: toEnum: month out of range 0..12"
instance NFData (Date (Hebrew n)) where
rnf :: Date (Hebrew n) -> ()
rnf (HebrewDate 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 (Hebrew n)) where
hashWithSalt :: Int -> Date (Hebrew n) -> Int
hashWithSalt Int
s (HebrewDate 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 (Hebrew n)) where
rnf :: Month (Hebrew n) -> ()
rnf Month (Hebrew n)
m = Month (Hebrew n)
m Month (Hebrew n) -> () -> ()
forall a b. a -> b -> b
`seq` ()
instance KnownNumbering n => Hashable (Month (Hebrew n)) where
hashWithSalt :: Int -> Month (Hebrew n) -> Int
hashWithSalt Int
s = Int -> Int -> Int
forall a. Hashable a => Int -> a -> Int
hashWithSalt Int
s (Int -> Int)
-> (Month (Hebrew n) -> Int) -> Month (Hebrew n) -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Month (Hebrew n) -> Int
forall a. Enum a => a -> Int
fromEnum
instance NFData (DayOfWeek (Hebrew n)) where
rnf :: DayOfWeek (Hebrew n) -> ()
rnf DayOfWeek (Hebrew n)
d = DayOfWeek (Hebrew n)
d DayOfWeek (Hebrew n) -> () -> ()
forall a b. a -> b -> b
`seq` ()
instance Hashable (DayOfWeek (Hebrew n)) where
hashWithSalt :: Int -> DayOfWeek (Hebrew n) -> Int
hashWithSalt Int
s = Int -> Int -> Int
forall a. Hashable a => Int -> a -> Int
hashWithSalt Int
s (Int -> Int)
-> (DayOfWeek (Hebrew n) -> Int) -> DayOfWeek (Hebrew n) -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DayOfWeek (Hebrew n) -> Int
forall a. Enum a => a -> Int
fromEnum
instance IsCalendarDateTime (Hebrew n) where
fromAdjustedInstant :: Instant -> CalendarDateTime (Hebrew n)
fromAdjustedInstant (Instant Int32
days Word32
secs Word32
nsecs) = Date (Hebrew n) -> LocalTime -> CalendarDateTime (Hebrew n)
forall calendar.
Date calendar -> LocalTime -> CalendarDateTime calendar
CalendarDateTime (Int32 -> Date (Hebrew n)
forall (n :: MonthNumbering). Int32 -> Date (Hebrew n)
hebrewFromDays Int32
days) (Word32 -> Word32 -> LocalTime
LocalTime Word32
secs Word32
nsecs)
toUnadjustedInstant :: CalendarDateTime (Hebrew n) -> Instant
toUnadjustedInstant (CalendarDateTime Date (Hebrew n)
hd (LocalTime Word32
secs Word32
nsecs)) = Int32 -> Word32 -> Word32 -> Instant
Instant (Date (Hebrew n) -> Int32
forall (n :: MonthNumbering). Date (Hebrew n) -> Int32
hebrewToDays Date (Hebrew n)
hd) Word32
secs Word32
nsecs
calendarDate :: DayOfMonth -> Month HebrewCivil -> Year -> Maybe (CalendarDate HebrewCivil)
calendarDate :: Int -> Month HebrewCivil -> Int -> Maybe (CalendarDate HebrewCivil)
calendarDate = Int -> Month HebrewCivil -> Int -> Maybe (CalendarDate HebrewCivil)
forall (n :: MonthNumbering).
Int -> Month (Hebrew n) -> Int -> Maybe (CalendarDate (Hebrew n))
calendarDate'
calendarDate' :: DayOfMonth -> Month (Hebrew n) -> Year -> Maybe (CalendarDate (Hebrew n))
calendarDate' :: forall (n :: MonthNumbering).
Int -> Month (Hebrew n) -> Int -> Maybe (CalendarDate (Hebrew n))
calendarDate' Int
d Month (Hebrew n)
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
y Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
1
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
<= Month (Hebrew n) -> Int -> Int
forall (n :: MonthNumbering). Month (Hebrew n) -> Int -> Int
maxDaysInMonth Month (Hebrew n)
m Int
y
let days :: Int
days = Int -> Int -> Int -> Int
hebrewYearMonthDayToDays Int
y (Month (Hebrew n) -> Int
forall (n :: MonthNumbering). Month (Hebrew n) -> Int
calendarIndex Month (Hebrew n)
m) Int
d
Bool -> Maybe ()
forall (f :: * -> *). Alternative f => Bool -> f ()
guard (Bool -> Maybe ()) -> Bool -> Maybe ()
forall a b. (a -> b) -> a -> b
$ Int
days Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
invalidDayThresh
CalendarDate (Hebrew n) -> Maybe (CalendarDate (Hebrew n))
forall a. a -> Maybe a
forall (m :: * -> *) a. Monad m => a -> m a
return (CalendarDate (Hebrew n) -> Maybe (CalendarDate (Hebrew n)))
-> CalendarDate (Hebrew n) -> Maybe (CalendarDate (Hebrew n))
forall a b. (a -> b) -> a -> b
$ Int32 -> CalendarDate (Hebrew n)
forall (n :: MonthNumbering). Int32 -> Date (Hebrew n)
hebrewFromDays (Int -> Int32
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
days)
fromNthDay :: DayNth -> DayOfWeek HebrewCivil -> Month HebrewCivil -> Year -> Maybe (CalendarDate HebrewCivil)
fromNthDay :: DayNth
-> DayOfWeek HebrewCivil
-> Month HebrewCivil
-> Int
-> Maybe (CalendarDate HebrewCivil)
fromNthDay = DayNth
-> DayOfWeek HebrewCivil
-> Month HebrewCivil
-> Int
-> Maybe (CalendarDate HebrewCivil)
forall (n :: MonthNumbering).
KnownNumbering n =>
DayNth
-> DayOfWeek (Hebrew n)
-> Month (Hebrew n)
-> Int
-> Maybe (CalendarDate (Hebrew n))
fromNthDay'
fromNthDay' :: KnownNumbering n => DayNth -> DayOfWeek (Hebrew n) -> Month (Hebrew n) -> Year -> Maybe (CalendarDate (Hebrew n))
fromNthDay' :: forall (n :: MonthNumbering).
KnownNumbering n =>
DayNth
-> DayOfWeek (Hebrew n)
-> Month (Hebrew n)
-> Int
-> Maybe (CalendarDate (Hebrew n))
fromNthDay' = Int
-> DayOfWeek (Hebrew n)
-> (Int -> Month (Hebrew n) -> Int -> Int)
-> (Month (Hebrew n) -> Int -> Int)
-> (Int32 -> CalendarDate (Hebrew n))
-> DayNth
-> DayOfWeek (Hebrew n)
-> Month (Hebrew n)
-> Int
-> Maybe (CalendarDate (Hebrew n))
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
invalidDayThresh DayOfWeek (Hebrew n)
forall (n :: MonthNumbering). DayOfWeek (Hebrew n)
epochDayOfWeek Int -> Month (Hebrew n) -> Int -> Int
forall {n :: MonthNumbering}. Int -> Month (Hebrew n) -> Int -> Int
ymd Month (Hebrew n) -> Int -> Int
forall (n :: MonthNumbering). Month (Hebrew n) -> Int -> Int
mdim Int32 -> CalendarDate (Hebrew n)
forall (n :: MonthNumbering). Int32 -> Date (Hebrew n)
hebrewFromDays
where
ymd :: Int -> Month (Hebrew n) -> Int -> Int
ymd Int
y Month (Hebrew n)
m Int
d = Int -> Int -> Int -> Int
hebrewYearMonthDayToDays Int
y (Month (Hebrew n) -> Int
forall (n :: MonthNumbering). Month (Hebrew n) -> Int
calendarIndex Month (Hebrew n)
m) Int
d
mdim :: Month (Hebrew n) -> Int -> Int
mdim Month (Hebrew n)
m Int
y = Month (Hebrew n) -> Int -> Int
forall (n :: MonthNumbering). Month (Hebrew n) -> Int -> Int
maxDaysInMonth Month (Hebrew n)
m Int
y
fromWeekDate :: WeekNumber -> DayOfWeek HebrewCivil -> Year -> Maybe (CalendarDate HebrewCivil)
fromWeekDate :: Int
-> DayOfWeek HebrewCivil -> Int -> Maybe (CalendarDate HebrewCivil)
fromWeekDate = Int
-> DayOfWeek HebrewCivil -> Int -> Maybe (CalendarDate HebrewCivil)
forall (n :: MonthNumbering).
Int
-> DayOfWeek (Hebrew n) -> Int -> Maybe (CalendarDate (Hebrew n))
fromWeekDate'
fromWeekDate' :: WeekNumber -> DayOfWeek (Hebrew n) -> Year -> Maybe (CalendarDate (Hebrew n))
fromWeekDate' :: forall (n :: MonthNumbering).
Int
-> DayOfWeek (Hebrew n) -> Int -> Maybe (CalendarDate (Hebrew n))
fromWeekDate' Int
weekNum DayOfWeek (Hebrew n)
dow Int
y = do
Bool -> Maybe ()
forall (f :: * -> *). Alternative f => Bool -> f ()
guard (Bool -> Maybe ()) -> Bool -> Maybe ()
forall a b. (a -> b) -> a -> b
$ Int
days Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
invalidDayThresh
CalendarDate (Hebrew n) -> Maybe (CalendarDate (Hebrew n))
forall a. a -> Maybe a
forall (m :: * -> *) a. Monad m => a -> m a
return (CalendarDate (Hebrew n) -> Maybe (CalendarDate (Hebrew n)))
-> CalendarDate (Hebrew n) -> Maybe (CalendarDate (Hebrew n))
forall a b. (a -> b) -> a -> b
$ Int32 -> CalendarDate (Hebrew n)
forall (n :: MonthNumbering). Int32 -> Date (Hebrew n)
hebrewFromDays (Int -> Int32
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
days)
where
startOfYear :: Int
startOfYear = Int -> Int -> Int -> Int
hebrewYearMonthDayToDays Int
y Int
0 Int
1
startDoW :: Int
startDoW = DayOfWeek (Hebrew Any) -> Int -> Int
forall dow. Enum dow => dow -> Int -> Int
dayOfWeekFromDays DayOfWeek (Hebrew Any)
forall (n :: MonthNumbering). DayOfWeek (Hebrew n)
epochDayOfWeek Int
startOfYear
weekStartDays :: Int
weekStartDays = Int
startOfYear Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
startDoW
days :: Int
days = Int
weekStartDays Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int -> Int
forall a. Enum a => a -> a
pred Int
weekNum Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
7 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ DayOfWeek (Hebrew n) -> Int
forall a. Enum a => a -> Int
fromEnum DayOfWeek (Hebrew n)
dow
calendarMonths :: [Month (Hebrew n)]
calendarMonths :: forall (n :: MonthNumbering). [Month (Hebrew n)]
calendarMonths = [Month (Hebrew n)
forall (n :: MonthNumbering). Month (Hebrew n)
Tishri, Month (Hebrew n)
forall (n :: MonthNumbering). Month (Hebrew n)
Cheshvan, Month (Hebrew n)
forall (n :: MonthNumbering). Month (Hebrew n)
Kislev, Month (Hebrew n)
forall (n :: MonthNumbering). Month (Hebrew n)
Tevet, Month (Hebrew n)
forall (n :: MonthNumbering). Month (Hebrew n)
Shevat, Month (Hebrew n)
forall (n :: MonthNumbering). Month (Hebrew n)
AdarI, Month (Hebrew n)
forall (n :: MonthNumbering). Month (Hebrew n)
Adar, Month (Hebrew n)
forall (n :: MonthNumbering). Month (Hebrew n)
Nisan, Month (Hebrew n)
forall (n :: MonthNumbering). Month (Hebrew n)
Iyar, Month (Hebrew n)
forall (n :: MonthNumbering). Month (Hebrew n)
Sivan, Month (Hebrew n)
forall (n :: MonthNumbering). Month (Hebrew n)
Tammuz, Month (Hebrew n)
forall (n :: MonthNumbering). Month (Hebrew n)
Av, Month (Hebrew n)
forall (n :: MonthNumbering). Month (Hebrew n)
Elul]
monthCount :: Int
monthCount :: Int
monthCount = [Month (Hebrew Any)] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Month (Hebrew Any)]
forall (n :: MonthNumbering). [Month (Hebrew n)]
calendarMonths
calendarIndex :: Month (Hebrew n) -> Int
calendarIndex :: forall (n :: MonthNumbering). Month (Hebrew n) -> Int
calendarIndex Month (Hebrew n)
m = Maybe Int -> Int
forall a. HasCallStack => Maybe a -> a
fromJust (Month (Hebrew n) -> [Month (Hebrew n)] -> Maybe Int
forall a. Eq a => a -> [a] -> Maybe Int
elemIndex Month (Hebrew n)
m [Month (Hebrew n)]
forall (n :: MonthNumbering). [Month (Hebrew n)]
calendarMonths)
monthAt :: Int -> Month (Hebrew n)
monthAt :: forall (n :: MonthNumbering). Int -> Month (Hebrew n)
monthAt Int
i
| Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
0 Bool -> Bool -> Bool
&& Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
monthCount = [Month (Hebrew n)]
forall (n :: MonthNumbering). [Month (Hebrew n)]
calendarMonths [Month (Hebrew n)] -> Int -> Month (Hebrew n)
forall a. HasCallStack => [a] -> Int -> a
!! Int
i
| Bool
otherwise = String -> Month (Hebrew n)
forall a. HasCallStack => String -> a
error String
"Data.HodaTime.Calendar.Hebrew: month index out of range 0..12"
adarICalIndex :: Int
adarICalIndex :: Int
adarICalIndex = Int
5
adarCalIndex :: Int
adarCalIndex :: Int
adarCalIndex = Int
6
epochDayOfWeek :: DayOfWeek (Hebrew n)
epochDayOfWeek :: forall (n :: MonthNumbering). DayOfWeek (Hebrew n)
epochDayOfWeek = DayOfWeek (Hebrew n)
forall (n :: MonthNumbering). DayOfWeek (Hebrew n)
Wednesday
invalidDayThresh :: Int
invalidDayThresh :: Int
invalidDayThresh = Int -> Int
forall a. Enum a => a -> a
pred (Int -> Int
firstDayOfYear Int
1)
hebrewRefDay :: Int
hebrewRefDay :: Int
hebrewRefDay = -Int
2103608
isLeapYear :: Year -> Bool
isLeapYear :: Int -> Bool
isLeapYear Int
y = (Int
7 Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
y Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
19 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
7
monthsInYear :: Year -> Int
monthsInYear :: Int -> Int
monthsInYear Int
y = if Int -> Bool
isLeapYear Int
y then Int
13 else Int
12
monthsElapsed :: Year -> Int
monthsElapsed :: Int -> Int
monthsElapsed Int
year = Int
235 Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
cycles Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
12 Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
inCycle Int -> Int -> Int
forall a. Num a => a -> a -> a
+ (Int
7 Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
inCycle Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) Int -> Int -> Int
forall a. Integral a => a -> a -> a
`div` Int
19
where (Int
cycles, Int
inCycle) = (Int
year 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
19
elapsedDays :: Year -> Int
elapsedDays :: Int -> Int
elapsedDays Int
year = Int
aduAdjusted
where
m :: Int
m = Int -> Int
monthsElapsed Int
year
partsElapsed :: Int
partsElapsed = Int
204 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
793 Int -> Int -> Int
forall a. Num a => a -> a -> a
* (Int
m Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
1080)
hoursElapsed :: Int
hoursElapsed = Int
5 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
12 Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
793 Int -> Int -> Int
forall a. Num a => a -> a -> a
* (Int
m Int -> Int -> Int
forall a. Integral a => a -> a -> a
`div` Int
1080) Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
partsElapsed Int -> Int -> Int
forall a. Integral a => a -> a -> a
`div` Int
1080
moladDay :: Int
moladDay = Int
1 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
29 Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
hoursElapsed Int -> Int -> Int
forall a. Integral a => a -> a -> a
`div` Int
24
moladParts :: Int
moladParts = Int
1080 Int -> Int -> Int
forall a. Num a => a -> a -> a
* (Int
hoursElapsed Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
24) Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
partsElapsed Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
1080
postponed :: Int
postponed
| Int
moladParts Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
19440 = Int
moladDay Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1
| Int
moladDay Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
7 Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
2 Bool -> Bool -> Bool
&& Int
moladParts Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
9924 Bool -> Bool -> Bool
&& Bool -> Bool
not (Int -> Bool
isLeapYear Int
year) = Int
moladDay Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1
| Int
moladDay Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
7 Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
1 Bool -> Bool -> Bool
&& Int
moladParts Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
16789 Bool -> Bool -> Bool
&& Int -> Bool
isLeapYear (Int
year Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) = Int
moladDay Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1
| Bool
otherwise = Int
moladDay
aduAdjusted :: Int
aduAdjusted = if Int
postponed Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
7 Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Int
0, Int
3, Int
5] then Int
postponed Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1 else Int
postponed
firstDayOfYear :: Year -> Int
firstDayOfYear :: Int -> Int
firstDayOfYear Int
year = Int
hebrewRefDay Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int -> Int
elapsedDays Int
year
daysInYear :: Year -> Int
daysInYear :: Int -> Int
daysInYear Int
year = Int -> Int
firstDayOfYear (Int
year Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int -> Int
firstDayOfYear Int
year
isCheshvanLong :: Year -> Bool
isCheshvanLong :: Int -> Bool
isCheshvanLong Int
year = Int -> Int
daysInYear Int
year Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
10 Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
5
isKislevShort :: Year -> Bool
isKislevShort :: Int -> Bool
isKislevShort Int
year = Int -> Int
daysInYear Int
year Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
10 Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
3
monthLengthByIndex :: Year -> Int -> Int
monthLengthByIndex :: Int -> Int -> Int
monthLengthByIndex Int
year Int
ci = case Int
ci of
Int
0 -> Int
30
Int
1 -> if Int -> Bool
isCheshvanLong Int
year then Int
30 else Int
29
Int
2 -> if Int -> Bool
isKislevShort Int
year then Int
29 else Int
30
Int
3 -> Int
29
Int
4 -> Int
30
Int
5 -> if Int -> Bool
isLeapYear Int
year then Int
30 else Int
0
Int
6 -> Int
29
Int
7 -> Int
30
Int
8 -> Int
29
Int
9 -> Int
30
Int
10 -> Int
29
Int
11 -> Int
30
Int
12 -> Int
29
Int
_ -> Int
0
maxDaysInMonth :: Month (Hebrew n) -> Year -> Int
maxDaysInMonth :: forall (n :: MonthNumbering). Month (Hebrew n) -> Int -> Int
maxDaysInMonth Month (Hebrew n)
m Int
year = Int -> Int -> Int
monthLengthByIndex Int
year (Month (Hebrew n) -> Int
forall (n :: MonthNumbering). Month (Hebrew n) -> Int
calendarIndex Month (Hebrew n)
m)
daysBeforeMonth :: Year -> Int -> Int
daysBeforeMonth :: Int -> Int -> Int
daysBeforeMonth Int
year Int
ci = [Int] -> Int
forall a. Num a => [a] -> a
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum [Int -> Int -> Int
monthLengthByIndex Int
year Int
i | Int
i <- [Int
0 .. Int
ci Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1]]
hebrewYearMonthDayToDays :: Year -> Int -> DayOfMonth -> Int
hebrewYearMonthDayToDays :: Int -> Int -> Int -> Int
hebrewYearMonthDayToDays Int
year Int
ci Int
d = Int -> Int
firstDayOfYear Int
year Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int -> Int -> Int
daysBeforeMonth Int
year Int
ci Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
d Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1
hebrewDaysToYmd :: Int32 -> (Int32, Word8, Word8)
hebrewDaysToYmd :: Int32 -> (Int32, Word8, Word8)
hebrewDaysToYmd Int32
flatDays = (Int -> Int32
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
year, Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
ci, 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
year :: Int
year = Int -> Int
findYear (Int -> Int
estimate Int
n)
(Int
ci, Int
d) = Int -> Int -> (Int, Int)
findMonth Int
0 (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int -> Int
firstDayOfYear Int
year)
findMonth :: Int -> Int -> (Int, Int)
findMonth Int
i Int
remaining
| Int
remaining Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
len = (Int
i, Int
remaining Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)
| Bool
otherwise = Int -> Int -> (Int, Int)
findMonth (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) (Int
remaining Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
len)
where len :: Int
len = Int -> Int -> Int
monthLengthByIndex Int
year Int
i
estimate :: Int -> Int
estimate Int
d0 = Int -> Int -> Int
forall a. Ord a => a -> a -> a
max Int
1 (Int -> Int) -> Int -> Int
forall a b. (a -> b) -> a -> b
$ (Int
d0 Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int -> Int
firstDayOfYear Int
1) Int -> Int -> Int
forall a. Integral a => a -> a -> a
`div` Int
366 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1
findYear :: Int -> Int
findYear Int
y
| Int -> Int
firstDayOfYear Int
y Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
n = Int -> Int
findYear (Int
y Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)
| Int -> Int
firstDayOfYear (Int
y Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
n = Int -> Int
findYear (Int
y Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)
| Bool
otherwise = Int
y
hebrewFromDays :: Int32 -> Date (Hebrew n)
hebrewFromDays :: forall (n :: MonthNumbering). Int32 -> Date (Hebrew n)
hebrewFromDays Int32
flatDays = Int32 -> Word8 -> Word8 -> Int32 -> Date (Hebrew n)
forall (n :: MonthNumbering).
Int32 -> Word8 -> Word8 -> Int32 -> Date (Hebrew n)
HebrewDate Int32
flatDays Word8
d Word8
ci Int32
y
where (Int32
y, Word8
ci, Word8
d) = Int32 -> (Int32, Word8, Word8)
hebrewDaysToYmd Int32
flatDays
hebrewToDays :: Date (Hebrew n) -> Int32
hebrewToDays :: forall (n :: MonthNumbering). Date (Hebrew n) -> Int32
hebrewToDays (HebrewDate Int32
flatDays Word8
_ Word8
_ Int32
_) = Int32
flatDays
hebrewToYmd :: Date (Hebrew n) -> (Int32, Word8, Word8)
hebrewToYmd :: forall (n :: MonthNumbering).
Date (Hebrew n) -> (Int32, Word8, Word8)
hebrewToYmd (HebrewDate Int32
_ Word8
d Word8
ci Int32
y) = (Int32
y, Word8
ci, Word8
d)
setHebrewDay :: DayOfMonth -> Date (Hebrew n) -> Date (Hebrew n)
setHebrewDay :: forall (n :: MonthNumbering).
Int -> Date (Hebrew n) -> Date (Hebrew n)
setHebrewDay Int
newDay Date (Hebrew n)
date = Int32 -> Date (Hebrew n)
forall (n :: MonthNumbering). Int32 -> Date (Hebrew n)
hebrewFromDays (Int -> Int32
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
days)
where
(Int32
y, Word8
ci, Word8
_) = Date (Hebrew n) -> (Int32, Word8, Word8)
forall (n :: MonthNumbering).
Date (Hebrew n) -> (Int32, Word8, Word8)
hebrewToYmd Date (Hebrew n)
date
startOfMonth :: Int
startOfMonth = Int -> Int
forall a. Enum a => a -> a
pred (Int -> Int) -> Int -> Int
forall a b. (a -> b) -> a -> b
$ Int -> Int -> Int -> Int
hebrewYearMonthDayToDays (Int32 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int32
y) (Word8 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word8
ci) Int
1
raw :: Int
raw = Int
startOfMonth Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
newDay
days :: Int
days = if Int
raw Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
invalidDayThresh then Int
raw else Int
invalidDayThresh Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1
setHebrewMonth :: Int -> Int -> Date (Hebrew n) -> Date (Hebrew n)
setHebrewMonth :: forall (n :: MonthNumbering).
Int -> Int -> Date (Hebrew n) -> Date (Hebrew n)
setHebrewMonth Int
start Int
target Date (Hebrew n)
date = Int32 -> Date (Hebrew n)
forall (n :: MonthNumbering). Int32 -> Date (Hebrew n)
hebrewFromDays (Int -> Int32
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
days)
where
(Int32
y, Word8
ci, Word8
d) = Date (Hebrew n) -> (Int32, Word8, Word8)
forall (n :: MonthNumbering).
Date (Hebrew n) -> (Int32, Word8, Word8)
hebrewToYmd Date (Hebrew n)
date
yr :: Int
yr = Int32 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int32
y
cur :: Int
cur = Word8 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word8
ci
current :: Int
current = (Int
cur Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
start) Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
monthCount
(Int
y', Int
ci') = Int -> Int -> Int -> (Int, Int)
addMonthsChrono Int
yr Int
cur (Int
target Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
current)
mdim :: Int
mdim = Int -> Int -> Int
monthLengthByIndex (Int -> Int -> Int
forall a. Ord a => a -> a -> a
max Int
1 Int
y') Int
ci'
d' :: Int
d' = Int -> Int -> Int
forall a. Ord a => a -> a -> a
min (Word8 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word8
d) Int
mdim
raw :: Int
raw = Int -> Int -> Int -> Int
hebrewYearMonthDayToDays (Int -> Int -> Int
forall a. Ord a => a -> a -> a
max Int
1 Int
y') Int
ci' Int
d'
days :: Int
days = if Int
raw Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
invalidDayThresh then Int
raw else Int
invalidDayThresh Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1
setHebrewYear :: Year -> Date (Hebrew n) -> Date (Hebrew n)
setHebrewYear :: forall (n :: MonthNumbering).
Int -> Date (Hebrew n) -> Date (Hebrew n)
setHebrewYear Int
newYear Date (Hebrew n)
date = Int32 -> Date (Hebrew n)
forall (n :: MonthNumbering). Int32 -> Date (Hebrew n)
hebrewFromDays (Int -> Int32
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
days)
where
(Int32
_, Word8
ci, Word8
d) = Date (Hebrew n) -> (Int32, Word8, Word8)
forall (n :: MonthNumbering).
Date (Hebrew n) -> (Int32, Word8, Word8)
hebrewToYmd Date (Hebrew n)
date
y' :: Int
y' = Int -> Int -> Int
forall a. Ord a => a -> a -> a
max Int
1 Int
newYear
ci' :: Int
ci' = if Word8 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word8
ci Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
adarICalIndex Bool -> Bool -> Bool
&& Bool -> Bool
not (Int -> Bool
isLeapYear Int
y') then Int
adarCalIndex else Word8 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word8
ci
mdim :: Int
mdim = Int -> Int -> Int
monthLengthByIndex Int
y' Int
ci'
d' :: Int
d' = Int -> Int -> Int
forall a. Ord a => a -> a -> a
min (Word8 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word8
d) Int
mdim
days :: Int
days = Int -> Int -> Int -> Int
hebrewYearMonthDayToDays Int
y' Int
ci' Int
d'
addMonthsChrono :: Year -> Int -> Int -> (Year, Int)
addMonthsChrono :: Int -> Int -> Int -> (Int, Int)
addMonthsChrono Int
year Int
ci Int
delta = Int -> Int -> (Int, Int)
go Int
year (Int -> Int -> Int
calIndexToPos Int
year Int
ci Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
delta)
where
go :: Int -> Int -> (Int, Int)
go Int
y Int
p
| Int
p Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
0 = Int -> Int -> (Int, Int)
go (Int
y Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) (Int
p Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int -> Int
monthsInYear (Int
y Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1))
| Int
p Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int -> Int
monthsInYear Int
y = Int -> Int -> (Int, Int)
go (Int
y Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) (Int
p Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int -> Int
monthsInYear Int
y)
| Bool
otherwise = (Int
y, Int -> Int -> Int
posToCalIndex Int
y Int
p)
calIndexToPos :: Year -> Int -> Int
calIndexToPos :: Int -> Int -> Int
calIndexToPos Int
year Int
ci
| Int -> Bool
isLeapYear Int
year = Int
ci
| Int
ci Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
adarICalIndex = Int
ci
| Bool
otherwise = Int
ci Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1
posToCalIndex :: Year -> Int -> Int
posToCalIndex :: Int -> Int -> Int
posToCalIndex Int
year Int
p
| Int -> Bool
isLeapYear Int
year = Int
p
| Int
p Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
adarICalIndex = Int
p
| Bool
otherwise = Int
p Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1