polysemy-zoo-0.6.0.0: src/Polysemy/Final/NonDet.hs
module Polysemy.Final.NonDet
(
module Polysemy.NonDet
, nonDetToFinal
) where
import Control.Applicative
import Polysemy
import Polysemy.NonDet
import Polysemy.Final
-----------------------------------------------------------------------------
-- | Run an 'NonDet' effect through a final 'Alternative'
--
-- /Beware/: Effects that aren't interpreted in terms of the final
-- monad will have local state semantics in regards to 'NonDet' effects
-- interpreted this way. See 'Final'.
nonDetToFinal :: (Member (Final m) r, Alternative m)
=> Sem (NonDet ': r) a
-> Sem r a
nonDetToFinal = interpretFinal $ \case
Empty -> pure empty
Choose left right -> do
left' <- runS left
right' <- runS right
pure $ left' <|> right'
{-# INLINE nonDetToFinal #-}