content: {-# OPTIONS -fno-warn-missing-methods #-}
  {-# LANGUAGE DeriveDataTypeable #-}
  {-# LANGUAGE EmptyDataDecls #-}
  
  -- | A limited subset of the time package.
  
  module Data.Time
    (-- * Compatible with the time package
    getCurrentTime
    ,fromGregorian
    ,UTCTime
    ,Day
    ,utctDay
    -- * Incompatible Fay-specific helpers
    ,showTime
    ,showDay)
    where
  
  import Data.Data
  import Data.Text
  import FFI
  import Prelude (Show,Eq,Ord,Int)
  
  -- | Date representation (internally represented as milliseconds from Epoch).
  data UTCTime
      deriving (Typeable)
  
  -- We provide no methods, this is just to satisfy type-safety. No
  -- methods work in Fay anyway.
  instance Data UTCTime
  instance Show UTCTime
  instance Eq UTCTime
  instance Ord UTCTime
  
  -- | Day representation (internally represented as milliseconds from Epoch).
  data Day
      deriving (Typeable)
  -- We provide no methods, this is just to satisfy type-safety. No
  -- methods work in Fay anyway.
  instance Data Day
  instance Show Day
  instance Eq Day
  instance Ord Day
  
  -- | Get the current time.
  getCurrentTime :: Fay UTCTime
  getCurrentTime = ffi "(new Date()).getTime()"
  
  -- | Convert from proleptic Gregorian calendar. First argument is
  -- year, second month number (1-12), third day (1-31).
  fromGregorian :: Int -- ^ Year.
                -> Int -- ^ Month.
                -> Int -- ^ Day.
                -> Day
  fromGregorian = ffi "Date.UTC(%1,%2-1,%3)"
  
  -- | Extract the day from the time.
  utctDay :: UTCTime -> Day
  utctDay = ffi "%1"
  
  -- | Show a time. Meant for debugging purposes, not production presentation.
  showTime :: UTCTime -> Text
  showTime = ffi "new Date(%1).toString()"
  
  -- | Show a day. Meant for debugging purposes, not production presentation.
  showDay :: Day -> Text
  showDay =
    ffi "(%1).getUTCFullYear() + ' ' + ((%1).getUTCMonth() + 1) + ' ' + ((%1).getUTCDate() + 1)"
  