lib/Data/Time/Calendar/Days.hs

    {-# LANGUAGE Safe #-}

    module Data.Time.Calendar.Days
        (
        -- * Days
          Day(..)
        , addDays
        , diffDays
        ) where

    import Control.DeepSeq
    import Data.Data
    import Data.Ix

    -- | The Modified Julian Day is a standard count of days, with zero being the day 1858-11-17.
    newtype Day = ModifiedJulianDay
        { toModifiedJulianDay :: Integer
        } deriving (Eq, Ord, Data, Typeable)

    instance NFData Day where
        rnf (ModifiedJulianDay a) = rnf a

    instance Enum Day where
        succ (ModifiedJulianDay a) = ModifiedJulianDay (succ a)
        pred (ModifiedJulianDay a) = ModifiedJulianDay (pred a)
        toEnum = ModifiedJulianDay . toEnum
        fromEnum (ModifiedJulianDay a) = fromEnum a
        enumFrom (ModifiedJulianDay a) = fmap ModifiedJulianDay (enumFrom a)
        enumFromThen (ModifiedJulianDay a) (ModifiedJulianDay b) = fmap ModifiedJulianDay (enumFromThen a b)
        enumFromTo (ModifiedJulianDay a) (ModifiedJulianDay b) = fmap ModifiedJulianDay (enumFromTo a b)
        enumFromThenTo (ModifiedJulianDay a) (ModifiedJulianDay b) (ModifiedJulianDay c) =
            fmap ModifiedJulianDay (enumFromThenTo a b c)

    instance Ix Day where
        range (ModifiedJulianDay a, ModifiedJulianDay b) = fmap ModifiedJulianDay (range (a, b))
        index (ModifiedJulianDay a, ModifiedJulianDay b) (ModifiedJulianDay c) = index (a, b) c
        inRange (ModifiedJulianDay a, ModifiedJulianDay b) (ModifiedJulianDay c) = inRange (a, b) c
        rangeSize (ModifiedJulianDay a, ModifiedJulianDay b) = rangeSize (a, b)

    addDays :: Integer -> Day -> Day
    addDays n (ModifiedJulianDay a) = ModifiedJulianDay (a + n)

    diffDays :: Day -> Day -> Integer
    diffDays (ModifiedJulianDay a) (ModifiedJulianDay b) = a - b