Пример #1
0
        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.");
                }
            }
        }
Пример #2
0
        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.");
                }
            }));
        }
Пример #3
0
        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.");
                }
            }));
        }
Пример #4
0
        public static T Wait <T>(this IEventual <T> eventual)
        {
            uint count;

            return(eventual.Wait(out count));
        }
Пример #5
0
 public Later(IEventual <T> content)
     : base(Event.Later)
 {
     Content = content;
 }
Пример #6
0
 public static IEventual <B> Continue <A, B>(this IEventual <A> eventual, Func <A, IEventual <B> > generate)
 {
     return(eventual.Fmap(generate).Join());
 }