module Polysemy.Time.Sleep where

import Control.Concurrent (threadDelay)

import Polysemy.Time.Data.TimeUnit (MicroSeconds(MicroSeconds), TimeUnit, convert)

uSleep ::
  Member (Embed IO) r =>
  MicroSeconds ->
  Sem r ()
uSleep :: MicroSeconds -> Sem r ()
uSleep (MicroSeconds us :: Int64
us) =
  IO () -> Sem r ()
forall (m :: * -> *) (r :: [(* -> *) -> * -> *]) a.
Member (Embed m) r =>
m a -> Sem r a
embed (Int -> IO ()
threadDelay (Int64 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int64
us))

tSleep ::
  Member (Embed IO) r =>
  TimeUnit t =>
  t ->
  Sem r ()
tSleep :: t -> Sem r ()
tSleep =
  MicroSeconds -> Sem r ()
forall (r :: [(* -> *) -> * -> *]).
Member (Embed IO) r =>
MicroSeconds -> Sem r ()
uSleep (MicroSeconds -> Sem r ()) -> (t -> MicroSeconds) -> t -> Sem r ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. t -> MicroSeconds
forall a b. (TimeUnit a, TimeUnit b) => a -> b
convert