module Hat.Time
  (ClockTime(),Month(January,February,March,April,May,June,July,August,September
      ,October,November,December),aJanuary,aFebruary,aMarch,aApril,aMay,aJune
    ,aJuly,aAugust,aSeptember,aOctober,aNovember,aDecember,Day(Sunday,Monday
      ,Tuesday,Wednesday,Thursday,Friday,Saturday),aSunday,aMonday,aTuesday
    ,aWednesday,aThursday,aFriday,aSaturday,CalendarTime(CalendarTime,bctYear
      ,bctMonth,bctDay,bctHour,bctMin,bctSec,bctPicosec,bctWDay,bctYDay
      ,bctTZName,bctTZ,bctIsDST),gctYear,gctMonth,gctDay,gctHour,gctMin,gctSec
    ,gctPicosec,gctWDay,gctYDay,gctTZName,gctTZ,gctIsDST,hctYear,hctMonth,hctDay
    ,hctHour,hctMin,hctSec,hctPicosec,hctWDay,hctYDay,hctTZName,hctTZ,hctIsDST
    ,actYear,actMonth,actDay,actHour,actMin,actSec,actPicosec,actWDay,actYDay
    ,actTZName,actTZ,actIsDST,aCalendarTime,TimeDiff(TimeDiff,btdYear,btdMonth
      ,btdDay,btdHour,btdMin,btdSec,btdPicosec),gtdYear,gtdMonth,gtdDay,gtdHour
    ,gtdMin,gtdSec,gtdPicosec,htdYear,htdMonth,htdDay,htdHour,htdMin,htdSec
    ,htdPicosec,atdYear,atdMonth,atdDay,atdHour,atdMin,atdSec,atdPicosec
    ,aTimeDiff,ggetClockTime,gaddToClockTime,aaddToClockTime,haddToClockTime
    ,gdiffClockTimes,adiffClockTimes,hdiffClockTimes,gtoCalendarTime
    ,atoCalendarTime,htoCalendarTime,gtoUTCTime,atoUTCTime,htoUTCTime
    ,gtoClockTime,atoClockTime,htoClockTime,gcalendarTimeToString
    ,acalendarTimeToString,hcalendarTimeToString,gformatCalendarTime
    ,aformatCalendarTime,hformatCalendarTime) where

import qualified Hat.PreludeBasic 
import qualified Prelude 
import Hat.Hack 
import qualified Hat.Hat as T 
import Hat.Hat  (WrapVal(wrapVal))
import Hat.Prelude 
import Hat.Ix  (Ix())
import Hat.Locale  (TimeLocale(TimeLocale,bwDays,bmonths,bamPm,bdateTimeFmt
    ,bdateFmt,btimeFmt,btime12Fmt),gwDays,gmonths,gamPm,gdateTimeFmt,gdateFmt
  ,gtimeFmt,gtime12Fmt,hwDays,hmonths,hamPm,hdateTimeFmt,hdateFmt,htimeFmt
  ,htime12Fmt,awDays,amonths,aamPm,adateTimeFmt,adateFmt,atimeFmt,atime12Fmt
  ,aTimeLocale,gdefaultTimeLocale)
import Hat.Char  (gintToDigit,aintToDigit,hintToDigit)
import Hat.PreludeBuiltinTypes 
import Hat.TimeBuiltinTypes 
import Hat.TimeBuiltin 
import qualified System.Time as Time 

instance Ord (ClockTime)
  where
  
  gcompare pcompare p = T.uconstUse pcompare p scompare
  
  scompare =
    T.uconstDef T.mkRoot a28v3v28v32compare
      (\ p -> gprimClockTimeCompare T.mkNoSrcPos p)
  
  (!<=) (%<=) p = T.uconstUse (%<=) p (|<=)
  
  (|<=) =
    T.uconstDef T.mkRoot (+$>=&=$>=$+<=)
      (\ p -> gprimClockTimeLeEq T.mkNoSrcPos p)
  

instance Eq (ClockTime)
  where
  
  (!==) (%==) p = T.uconstUse (%==) p (|==)
  
  (|==) =
    T.uconstDef T.mkRoot (+%$=&=%$=$+==)
      (\ p -> gprimClockTimeEqEq T.mkNoSrcPos p)
  

gprimClockTimeCompare ::
  T.RefSrcPos -> T.RefExp -> T.R (T.Fun ClockTime (T.Fun ClockTime Ordering))

gprimClockTimeCompare pprimClockTimeCompare p =
  T.ufun2 aprimClockTimeCompare pprimClockTimeCompare p hprimClockTimeCompare

hprimClockTimeCompare z1primClockTimeCompare z2primClockTimeCompare
  kprimClockTimeCompare =
  fromOrdering kprimClockTimeCompare
    (Prelude.compare (toClockTime kprimClockTimeCompare z1primClockTimeCompare)
      (toClockTime kprimClockTimeCompare z2primClockTimeCompare))

gprimClockTimeLeEq ::
  T.RefSrcPos -> T.RefExp -> T.R (T.Fun ClockTime (T.Fun ClockTime Bool))

gprimClockTimeLeEq pprimClockTimeLeEq p =
  T.ufun2 aprimClockTimeLeEq pprimClockTimeLeEq p hprimClockTimeLeEq

hprimClockTimeLeEq z1primClockTimeLeEq z2primClockTimeLeEq kprimClockTimeLeEq =
  fromBool kprimClockTimeLeEq
    ((toClockTime kprimClockTimeLeEq z1primClockTimeLeEq)
      Prelude.<=
      (toClockTime kprimClockTimeLeEq z2primClockTimeLeEq))

gprimClockTimeEqEq ::
  T.RefSrcPos -> T.RefExp -> T.R (T.Fun ClockTime (T.Fun ClockTime Bool))

gprimClockTimeEqEq pprimClockTimeEqEq p =
  T.ufun2 aprimClockTimeEqEq pprimClockTimeEqEq p hprimClockTimeEqEq

hprimClockTimeEqEq z1primClockTimeEqEq z2primClockTimeEqEq kprimClockTimeEqEq =
  fromBool kprimClockTimeEqEq
    ((toClockTime kprimClockTimeEqEq z1primClockTimeEqEq)
      Prelude.==
      (toClockTime kprimClockTimeEqEq z2primClockTimeEqEq))

ggetClockTime :: T.RefSrcPos -> T.RefExp -> T.R (IO ClockTime)

ggetClockTime pgetClockTime p = T.uconstUse pgetClockTime p sgetClockTime

sgetClockTime =
  T.uconstDef T.mkRoot agetClockTime
    (\ p -> (T.fromIO fromClockTime) p Time.getClockTime)

gaddToClockTime ::
  T.RefSrcPos -> T.RefExp -> T.R (T.Fun TimeDiff (T.Fun ClockTime ClockTime))

gaddToClockTime paddToClockTime p =
  T.ufun2 aaddToClockTime paddToClockTime p haddToClockTime

haddToClockTime z1addToClockTime z2addToClockTime kaddToClockTime =
  fromClockTime kaddToClockTime
    (Time.addToClockTime (toTimeDiff kaddToClockTime z1addToClockTime)
      (toClockTime kaddToClockTime z2addToClockTime))

gdiffClockTimes ::
  T.RefSrcPos -> T.RefExp -> T.R (T.Fun ClockTime (T.Fun ClockTime TimeDiff))

gdiffClockTimes pdiffClockTimes p =
  T.ufun2 adiffClockTimes pdiffClockTimes p hdiffClockTimes

hdiffClockTimes z1diffClockTimes z2diffClockTimes kdiffClockTimes =
  fromTimeDiff kdiffClockTimes
    (Time.diffClockTimes (toClockTime kdiffClockTimes z1diffClockTimes)
      (toClockTime kdiffClockTimes z2diffClockTimes))

gtoCalendarTime ::
  T.RefSrcPos -> T.RefExp -> T.R (T.Fun ClockTime (IO CalendarTime))

gtoCalendarTime ptoCalendarTime p =
  T.ufun1 atoCalendarTime ptoCalendarTime p htoCalendarTime

htoCalendarTime z1toCalendarTime ktoCalendarTime =
  (T.fromIO fromCalendarTime) ktoCalendarTime
    (Time.toCalendarTime (toClockTime ktoCalendarTime z1toCalendarTime))

gtoUTCTime :: T.RefSrcPos -> T.RefExp -> T.R (T.Fun ClockTime CalendarTime)

gtoUTCTime ptoUTCTime p = T.ufun1 atoUTCTime ptoUTCTime p htoUTCTime

htoUTCTime z1toUTCTime ktoUTCTime =
  fromCalendarTime ktoUTCTime
    (Time.toUTCTime (toClockTime ktoUTCTime z1toUTCTime))

gtoClockTime :: T.RefSrcPos -> T.RefExp -> T.R (T.Fun CalendarTime ClockTime)

gtoClockTime ptoClockTime p = T.ufun1 atoClockTime ptoClockTime p htoClockTime

htoClockTime z1toClockTime ktoClockTime =
  fromClockTime ktoClockTime
    (Time.toClockTime (toCalendarTime ktoClockTime z1toClockTime))

gcalendarTimeToString ::
  T.RefSrcPos -> T.RefExp -> T.R (T.Fun CalendarTime String)

gcalendarTimeToString pcalendarTimeToString p =
  T.ufun1 acalendarTimeToString pcalendarTimeToString p hcalendarTimeToString

hcalendarTimeToString z1calendarTimeToString kcalendarTimeToString =
  fromString kcalendarTimeToString
    (Time.calendarTimeToString
      (toCalendarTime kcalendarTimeToString z1calendarTimeToString))

gformatCalendarTime ::
  T.RefSrcPos ->
    T.RefExp ->
      T.R (T.Fun TimeLocale (T.Fun String (T.Fun CalendarTime String)))

gformatCalendarTime pformatCalendarTime p =
  T.ufun3 aformatCalendarTime pformatCalendarTime p hformatCalendarTime

hformatCalendarTime z1formatCalendarTime z2formatCalendarTime
  z3formatCalendarTime kformatCalendarTime =
  fromString kformatCalendarTime
    (Time.formatCalendarTime
      (toTimeLocale kformatCalendarTime z1formatCalendarTime)
      (toString kformatCalendarTime z2formatCalendarTime)
      (toCalendarTime kformatCalendarTime z3formatCalendarTime))

tTime = T.mkModule "Time" "Time.hs" Prelude.False

aprimClockTimeCompare =
  T.mkVariable tTime 340001 350059 3 2 "primClockTimeCompare" Prelude.False

aprimClockTimeLeEq =
  T.mkVariable tTime 370001 380052 3 2 "primClockTimeLeEq" Prelude.False

aprimClockTimeEqEq =
  T.mkVariable tTime 400001 410052 3 2 "primClockTimeEqEq" Prelude.False

agetClockTime =
  T.mkVariable tTime 430001 440030 3 0 "getClockTime" Prelude.False

aaddToClockTime =
  T.mkVariable tTime 460001 470066 3 2 "addToClockTime" Prelude.False

adiffClockTimes =
  T.mkVariable tTime 490001 500065 3 2 "diffClockTimes" Prelude.False

atoCalendarTime =
  T.mkVariable tTime 520001 530046 3 1 "toCalendarTime" Prelude.False

atoUTCTime = T.mkVariable tTime 550001 560056 3 1 "toUTCTime" Prelude.False

atoClockTime = T.mkVariable tTime 580001 590053 3 1 "toClockTime" Prelude.False

acalendarTimeToString =
  T.mkVariable tTime 610001 620050 3 1 "calendarTimeToString" Prelude.False

aformatCalendarTime =
  T.mkVariable tTime 640001 650069 3 3 "formatCalendarTime" Prelude.False

a28v3v28v32compare =
  T.mkVariable tTime 280003 280032 3 0 "compare" Prelude.False

(+$>=&=$>=$+<=) = T.mkVariable tTime 290004 290026 16 0 "<=" Prelude.False

(+%$=&=%$=$+==) = T.mkVariable tTime 320004 320026 16 0 "==" Prelude.False