Skip to content

Instantly share code, notes, and snippets.

@controlflow
Forked from leppie/gist:2868328
Created June 4, 2012 13:25
Show Gist options
  • Save controlflow/2868357 to your computer and use it in GitHub Desktop.
Save controlflow/2868357 to your computer and use it in GitHub Desktop.
CallWithEscapeContinuation
using System;
class Program
{
sealed class EscapeContinuation<T> : Exception
{
public T Value { get; private set; }
public void Raise(T value)
{
Value = value;
throw this;
}
}
static R CallWithEscapeContinuation<R>(Func<Action<R>, R> call)
{
var ec = new EscapeContinuation<R>();
try
{
return call(ec.Raise);
}
catch (EscapeContinuation<R> c)
{
if (c == ec)
{
return c.Value;
}
else
{
throw;
}
}
}
static void Main(string[] args)
{
var index = CallWithEscapeContinuation<int>(ec =>
{
ec(40);
return -1;
});
Console.WriteLine(index);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment