packages feed

axel-0.0.11: src/Axel/Eff/Random.hs

{-# LANGUAGE GADTs #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TemplateHaskell #-}

module Axel.Eff.Random where

import Axel.Prelude

import qualified Polysemy as Sem

import qualified System.Random as R

data Random m a where
  Random :: (R.Random a) => Random m a

Sem.makeSem ''Random

runRandom ::
     (Sem.Member (Sem.Embed IO) effs)
  => Sem.Sem (Random ': effs) a
  -> Sem.Sem effs a
runRandom =
  Sem.interpret $ \case
    (Random :: Random m a) -> Sem.embed $ R.randomIO @a