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