static void Main() { var results = NonDetEffectHandler.Run(Foo()); foreach (var result in results) { Console.WriteLine(result); } }
public static List <TResult> Run <TResult>(Eff <TResult> eff) { switch (eff) { case ExceptionEff <TResult> setException: throw setException.Exception; case ResultEff <TResult> setResult: return(new List <TResult> { setResult.Result }); case DelayEff <TResult> delay: return(Run(delay.Continuation.MoveNext())); case AwaitEff <TResult> awaitEff: var handler = new NonDetEffectHandler <TResult>(awaitEff.Continuation); awaitEff.Awaiter.Accept(handler); return(handler.Results); default: throw new NotSupportedException($"{eff.GetType().Name}"); } }