packages feed

atelier-core-1.0.0.0: src/Atelier/Effects/GenUUID.hs

-- | An effect for generating UUIDs.
module Atelier.Effects.GenUUID
    ( GenUUID
    , UUID
    , gen
    , runIO
    , runConst
    )
where

import Data.UUID (UUID)
import Data.UUID.V4 (nextRandom)
import Effectful (Effect, IOE)
import Effectful.Dispatch.Dynamic (interpret_)
import Effectful.TH (makeEffect)


-- | Effect for generating UUIDs.
data GenUUID :: Effect where
    -- | Generate a UUID.
    Gen :: GenUUID m UUID


makeEffect ''GenUUID


-- | Interpret 'GenUUID' by generating fresh random (version 4) UUIDs.
--
-- Produces fresh random (version 4) UUIDs.
runIO :: (IOE :> es) => Eff (GenUUID : es) a -> Eff es a
runIO = interpret_ \Gen -> liftIO nextRandom


-- | Interpret 'GenUUID' so 'gen' always returns the given fixed UUID, for tests.
--
-- Returns a fixed UUID every time, for deterministic tests.
runConst :: UUID -> Eff (GenUUID : es) a -> Eff es a
runConst uuid = interpret_ \Gen -> pure uuid