{-# options_haddock prune #-}

-- |Time effect, Internal
module Polysemy.Time.Effect.Time where

import Polysemy.Time.Data.TimeUnit (AddTimeUnit, TimeUnit)

-- |The Time effect.
data Time (time :: Type) (date :: Type) :: Effect where
  -- |Produce the current time, possibly relative to what was set with 'SetTime' or 'SetDate'
  Now :: Time t d m t
  -- |Produce the current date, possibly relative to what was set with 'SetTime' or 'SetDate'
  Today :: Time t d m d
  -- |Suspend the current computation for the specified time span.
  Sleep :: TimeUnit u => u -> Time t d m ()
  -- |Set the current time, if the interpreter supports it.
  SetTime :: t -> Time t d m ()
  -- |Adjust the current time relatively, if the interpreter supports it.
  Adjust :: TimeUnit u1 => u1 -> Time t d m ()
  -- |Set the current date, if the interpreter supports it.
  SetDate :: d -> Time t d m ()

makeSem_ ''Time

-- |Produce the current time, possibly relative to what was set with 'SetTime' or 'SetDate'
now ::
   t d r .
  Member (Time t d) r =>
  Sem r t

-- |Produce the current date, possibly relative to what was set with 'SetTime' or 'SetDate'
today ::
   t d r .
  Member (Time t d) r =>
  Sem r d

-- |Suspend the current computation for the specified time span.
sleep ::
   t d u r .
  TimeUnit u =>
  Member (Time t d) r =>
  u ->
  Sem r ()

-- |Set the current time, if the interpreter supports it.
setTime ::
   t d r .
  Member (Time t d) r =>
  t ->
  Sem r ()

-- |Adjust the current time relatively, if the interpreter supports it.
adjust ::
   t d u1 u2 r .
  AddTimeUnit t u1 u2 =>
  Member (Time t d) r =>
  u1 ->
  Sem r ()

-- |Set the current date, if the interpreter supports it.
setDate ::
   t d r .
  Member (Time t d) r =>
  d ->
  Sem r ()