From 390a8732eff8c3e93a6927212d5fe234f865ca99 Mon Sep 17 00:00:00 2001 From: Pierre Thierry Date: Wed, 8 Apr 2026 15:36:48 +0200 Subject: [PATCH] Add runNonDetFinal [WIP] WARNING: this doesn't build --- src/Polysemy/NonDet.hs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/Polysemy/NonDet.hs b/src/Polysemy/NonDet.hs index 419ba3d3..784dc966 100644 --- a/src/Polysemy/NonDet.hs +++ b/src/Polysemy/NonDet.hs @@ -1,5 +1,9 @@ +{-# LANGUAGE AllowAmbiguousTypes #-} {-# LANGUAGE DeriveAnyClass #-} +{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE UndecidableInstances #-} -- | Description: Interpreters for 'NonDet' module Polysemy.NonDet @@ -18,6 +22,7 @@ import Data.Maybe import Polysemy import Polysemy.Error +import Polysemy.Final (Final, interpretFinal, liftS, runS) import Polysemy.Internal import Polysemy.Internal.NonDet import Polysemy.Internal.Union @@ -72,6 +77,18 @@ nonDetToError (e :: e) = interpretH $ \case {-# INLINE nonDetToError #-} +------------------------------------------------------------------------------ +-- | Run a 'NonDet' effect in terms of the 'Final' 'Alternative' @m@. +runNonDetFinal :: (Member (Final m) r, Alternative m) => Sem (NonDet ': r) a -> Sem r a +runNonDetFinal = interpretFinal $ \case + Empty -> liftS empty + Choose semA semB -> do + a <- runS semA + b <- runS semB + pure $ a <|> b +{-# INLINE runNonDetFinal #-} + + -------------------------------------------------------------------------------- -- This stuff is lifted from 'fused-effects'. Thanks guys! runNonDetC :: (Alternative f, Applicative m) => NonDetC m a -> m (f a)