axel-0.0.11: src/Axel/Eff/Loop.hs
{-# LANGUAGE GADTs #-}
{-# LANGUAGE ScopedTypeVariables #-}
-- Inspired by http://www.haskellforall.com/2012/07/breaking-from-loop.html.
module Axel.Eff.Loop where
import Axel.Prelude
import Control.Monad (void)
import qualified Polysemy as Sem
import qualified Polysemy.Error as Sem
type Loop a = Sem.Error a
breakLoop ::
forall a effs. (Sem.Member (Loop a) effs)
=> a
-> Sem.Sem effs ()
breakLoop = void . Sem.throw
runLoop :: forall a effs. Sem.Sem (Loop a ': effs) a -> Sem.Sem effs a
runLoop x = either id id <$> Sem.runError x