Beispiel #1
0
        public override Haxl ToHaxlFetch(string bindTo, Scope scope)
        {
            Func <Task <object>, Haxl> DoneFromTask =
                t => Haxl.FromFunc((c, l) => Done.New(_ => scope.Add(bindTo, WarnIfNull(t.Result, l))));

            return(Haxl.FromFunc((cache, logger) =>
            {
                var cacheResult = cache.Lookup(request);
                return cacheResult.Match <Result>
                (
                    notFound =>
                {
                    var blocked = new BlockedRequest(request, request.GetType(), bindTo);
                    cache.Insert(request, blocked);
                    return Blocked.New(
                        new List <BlockedRequest> {
                        blocked
                    },
                        DoneFromTask(blocked.Resolver.Task)
                        );
                },
                    found =>
                {
                    var task = found.Resolver.Task;
                    if (task.IsCompleted)
                    {
                        return Done.New(_ =>
                        {
                            var result = task.Result;
                            return scope.Add(bindTo, WarnIfNull(result, logger));
                        });
                    }
                    return Blocked.New(
                        new List <BlockedRequest>(),
                        DoneFromTask(task)
                        );
                }
                );
            }));
        }