{-# OPTIONS_HADDOCK hide #-} {-# OPTIONS_GHC -Wno-orphans #-} {-# LANGUAGE UndecidableInstances #-} -- | This module is for some experimental implementations and tinkering. Not -- intended to be exposed or depended on. module Control.Eff.Logic.Experimental where import Control.Eff import Control.Eff.Extend import Control.Eff.Exception import Control.Eff.Logic.Core import Control.Monad instance (MonadPlus (Eff (Exc CutFalse : r)), MSplit (Eff (Exc CutFalse : r))) => Call r where call m = loop m [] where loop m' jq = case msplit m' of Val Nothing -> next jq -- (C1) Val (Just (x, q)) -> return x `mplus` next (q : jq) -- (C2) E q u -> case u of U0 (Exc CutFalse) -> next [] -- drop jq (F2) U1 _ -> loop (E q u >>= reflect) jq -- (C4?) --_ -> loop m' jq next jq = list mzero loop jq -- (C3?) {- call m = loop (msplit m) [] where loop (Val Nothing) jq = next jq -- (C1) loop (Val (Just (x, q))) jq = return x `mplus` next (q : jq) -- (C2) loop (E q u) jq = case u of U0 (Exc CutFalse) -> next [] -- drop jq (F2) _ -> loop (E q u) jq -- (C4?) next [] = mzero next (h:t) = loop (msplit h) t -- (C3?) -}