module Data.Time.Calendar.Easter
(
sundayAfter,
orthodoxPaschalMoon,orthodoxEaster,
gregorianPaschalMoon,gregorianEaster
) where
import Data.Time.Calendar
import Data.Time.Calendar.Julian
sundayAfter :: Day -> Day
sundayAfter :: Day -> Day
sundayAfter day :: Day
day = Integer -> Day -> Day
addDays (7 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
- (Integer -> Integer -> Integer
forall a. Integral a => a -> a -> a
mod (Day -> Integer
toModifiedJulianDay Day
day Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ 3) 7)) Day
day
orthodoxPaschalMoon :: Integer -> Day
orthodoxPaschalMoon :: Integer -> Day
orthodoxPaschalMoon year :: Integer
year = Integer -> Day -> Day
addDays (- Integer
shiftedEpact) (Integer -> Int -> Int -> Day
fromJulian Integer
jyear 4 19) where
shiftedEpact :: Integer
shiftedEpact = Integer -> Integer -> Integer
forall a. Integral a => a -> a -> a
mod (14 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ 11 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* (Integer -> Integer -> Integer
forall a. Integral a => a -> a -> a
mod Integer
year 19)) 30
jyear :: Integer
jyear = if Integer
year Integer -> Integer -> Bool
forall a. Ord a => a -> a -> Bool
> 0 then Integer
year else Integer
year Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
- 1
orthodoxEaster :: Integer -> Day
orthodoxEaster :: Integer -> Day
orthodoxEaster = Day -> Day
sundayAfter (Day -> Day) -> (Integer -> Day) -> Integer -> Day
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> Day
orthodoxPaschalMoon
gregorianPaschalMoon :: Integer -> Day
gregorianPaschalMoon :: Integer -> Day
gregorianPaschalMoon year :: Integer
year = Integer -> Day -> Day
addDays (- Integer
adjustedEpact) (Integer -> Int -> Int -> Day
fromGregorian Integer
year 4 19) where
century :: Integer
century = (Integer -> Integer -> Integer
forall a. Integral a => a -> a -> a
div Integer
year 100) Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ 1
shiftedEpact :: Integer
shiftedEpact = Integer -> Integer -> Integer
forall a. Integral a => a -> a -> a
mod (14 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ 11 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* (Integer -> Integer -> Integer
forall a. Integral a => a -> a -> a
mod Integer
year 19) Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
- (Integer -> Integer -> Integer
forall a. Integral a => a -> a -> a
div (3 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
century) 4) Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ (Integer -> Integer -> Integer
forall a. Integral a => a -> a -> a
div (5 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ 8 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
century) 25)) 30
adjustedEpact :: Integer
adjustedEpact = if Integer
shiftedEpact Integer -> Integer -> Bool
forall a. Eq a => a -> a -> Bool
== 0 Bool -> Bool -> Bool
|| ((Integer
shiftedEpact Integer -> Integer -> Bool
forall a. Eq a => a -> a -> Bool
== 1) Bool -> Bool -> Bool
&& (Integer -> Integer -> Integer
forall a. Integral a => a -> a -> a
mod Integer
year 19 Integer -> Integer -> Bool
forall a. Ord a => a -> a -> Bool
< 10)) then Integer
shiftedEpact Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ 1 else Integer
shiftedEpact
gregorianEaster :: Integer -> Day
gregorianEaster :: Integer -> Day
gregorianEaster = Day -> Day
sundayAfter (Day -> Day) -> (Integer -> Day) -> Integer -> Day
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> Day
gregorianPaschalMoon