packages feed

aws-mfa-credentials-0.1.0.0: AwsMfaCredentials/Interpreters/Wait.hs

{-# LANGUAGE DataKinds           #-}
{-# LANGUAGE FlexibleContexts    #-}
{-# LANGUAGE GADTs               #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeOperators       #-}
module AwsMfaCredentials.Interpreters.Wait where

import Control.Concurrent (threadDelay)
import Control.Monad.Freer (Eff, Member, runNat)
import Control.Monad.Freer.Writer (Writer(..))
import Data.Time
  (NominalDiffTime, UTCTime, diffUTCTime, getCurrentTime)

runWait :: forall r a . (Member IO r)
        => Eff ((Writer UTCTime) ': r) a
        -> Eff r a
runWait = runNat waitUntil
  where
    waitUntil :: Writer UTCTime x -> IO x
    waitUntil (Writer time) =
      getCurrentTime >>=
        threadDelay . nominalDiffTimeToMicroseconds . diffUTCTime time

    nominalDiffTimeToMicroseconds :: NominalDiffTime -> Int
    nominalDiffTimeToMicroseconds = floor . (* 10 ^ (6 :: Integer))