{-|
This package provides a Polysemy effect for interacting with the current time and sleeping, as well as some time-related
data types and classes.
-}
module Polysemy.Time (
  -- $intro
  -- * Time effect
  module Polysemy.Time.Data.Time,
  GhcTime,
  -- * Interpreters
  interpretTimeGhc,
  interpretTimeGhcAt,
  -- * Data types
  module Polysemy.Time.Data.TimeUnit,
  module Polysemy.Time.Calendar,
) where

import Polysemy.Time.Calendar (
  Calendar(..),
  HasDay(..),
  HasHour(..),
  HasMinute(..),
  HasMonth(..),
  HasNanoSecond(..),
  HasSecond(..),
  HasYear(..),
  )
import Polysemy.Time.Data.Time (Time(..), adjust, now, setDate, setTime, sleep, today)
import Polysemy.Time.Data.TimeUnit (
  Days(Days),
  Hours(Hours),
  MicroSeconds(MicroSeconds),
  MilliSeconds(MilliSeconds),
  Minutes(Minutes),
  Months(Months),
  NanoSeconds(NanoSeconds),
  Seconds(Seconds),
  TimeUnit,
  Weeks(Weeks),
  Years(Years),
  convert,
  )
import Polysemy.Time.Ghc (GhcTime, interpretTimeGhc, interpretTimeGhcAt)
import Polysemy.Time.Orphans ()

{- $intro
@
import Data.Time (UTCTime)
import Polysemy (Members, runM)
import Polysemy.Chronos (interpretTimeChronos)
import qualified Polysemy.Time as Time
import Polysemy.Time (MilliSeconds(MilliSeconds), Seconds(Seconds), Time, interpretTimeGhcAt, mkDatetime, year)

prog ::
  Ord t =>
  Member (Time t d) r =>
  Sem r ()
prog = do
  time1 \<- Time.now
  Time.sleep (MilliSeconds 10)
  time2 \<- Time.now
  print (time1 \< time2)
  -- True

testTime :: UTCTime
testTime =
  mkDatetime 1845 12 31 23 59 59

main :: IO ()
main =
  runM do
    interpretTimeChronos prog
    interpretTimeGhcAt testTime do
      Time.sleep (Seconds 1)
      time \<- Time.now
      print (year time)
      -- Years { unYear = 1846 }
@
-}