1{-# OPTIONS -fno-warn-unused-imports #-}
2module Data.Time.Calendar.Days
3(
4    -- * Days
5    Day(..),addDays,diffDays
6) where
7
8import Control.DeepSeq
9import Data.Ix
10import Data.Typeable
11import Data.Data
12
13-- | The Modified Julian Day is a standard count of days, with zero being the day 1858-11-17.
14newtype Day = ModifiedJulianDay {toModifiedJulianDay :: Integer} deriving (Eq,Ord,Data, Typeable)
15
16instance NFData Day where
17    rnf (ModifiedJulianDay a) = rnf a
18
19-- necessary because H98 doesn't have "cunning newtype" derivation
20instance Enum Day where
21    succ (ModifiedJulianDay a) = ModifiedJulianDay (succ a)
22    pred (ModifiedJulianDay a) = ModifiedJulianDay (pred a)
23    toEnum = ModifiedJulianDay . toEnum
24    fromEnum (ModifiedJulianDay a) = fromEnum a
25    enumFrom (ModifiedJulianDay a) = fmap ModifiedJulianDay (enumFrom a)
26    enumFromThen (ModifiedJulianDay a) (ModifiedJulianDay b) = fmap ModifiedJulianDay (enumFromThen a b)
27    enumFromTo (ModifiedJulianDay a) (ModifiedJulianDay b) = fmap ModifiedJulianDay (enumFromTo a b)
28    enumFromThenTo (ModifiedJulianDay a) (ModifiedJulianDay b) (ModifiedJulianDay c) = fmap ModifiedJulianDay (enumFromThenTo a b c)
29
30-- necessary because H98 doesn't have "cunning newtype" derivation
31instance Ix Day where
32    range (ModifiedJulianDay a,ModifiedJulianDay b) = fmap ModifiedJulianDay (range (a,b))
33    index (ModifiedJulianDay a,ModifiedJulianDay b) (ModifiedJulianDay c) = index (a,b) c
34    inRange (ModifiedJulianDay a,ModifiedJulianDay b) (ModifiedJulianDay c) = inRange (a,b) c
35    rangeSize (ModifiedJulianDay a,ModifiedJulianDay b) = rangeSize (a,b)
36
37addDays :: Integer -> Day -> Day
38addDays n (ModifiedJulianDay a) = ModifiedJulianDay (a + n)
39
40diffDays :: Day -> Day -> Integer
41diffDays (ModifiedJulianDay a) (ModifiedJulianDay b) = a - b
42