public static T Wait <T>(this IEventual <T> eventual, out uint count) { count = 0; while (true) { var @event = eventual.Unroll(); switch (@event.Tag) { case Event.Now: var now = (Event <T> .Now)@event; return(now.Content); case Event.Later: var later = (Event <T> .Later)@event; eventual = later.Content; count++; break; default: throw new InvalidProgramException("Should never happen."); } } }
public static IEventual <T> Join <T>(this IEventual <IEventual <T> > eventual) { return(new Eventual <T>( unrollF: () => { var @event = eventual.Unroll(); switch (@event.Tag) { case Event.Now: var now = (Event <IEventual <T> > .Now)@event; return new Event <T> .Later(now.Content); case Event.Later: var later = (Event <IEventual <T> > .Later)@event; return new Event <T> .Later(later.Content.Join()); default: throw new InvalidProgramException("Should never happen."); } })); }
public static IEventual <B> Fmap <A, B>(this IEventual <A> eventual, Func <A, B> convert) { return(new Eventual <B>( unrollF: () => { var @event = eventual.Unroll(); switch (@event.Tag) { case Event.Now: var now = (Event <A> .Now)@event; return new Event <B> .Now(convert(now.Content)); case Event.Later: var later = (Event <A> .Later)@event; return new Event <B> .Later(later.Content.Fmap <A, B>(convert)); default: throw new InvalidProgramException("Should never happen."); } })); }