private void LoadProjectFile(InternalLoadProject obj)
        {
            try
            {
                using var stream = File.OpenRead(obj.ProjectFile.Source);
                using var reader = new BinaryReader(stream);
                var projectFile = ProjectFile.ReadFile(reader, obj.ProjectFile.Source, Sender);

                obj.OriginalSender.Tell(new LoadedProjectFile(obj.ProjectFile.OperationId, projectFile, null, true));
            }
            catch (Exception e)
            {
                obj.OriginalSender.Tell(new LoadedProjectFile(obj.ProjectFile.OperationId,
                                                              ProjectFile.FromSource(obj.ProjectFile.Source, Sender), e, false));
            }
            finally
            {
                Context.Stop(Self);
            }
        }
        private Maybe <LoadedProjectFile> LoadProjectFile(Maybe <InternalLoadProject> obj)
        {
            Maybe <ProjectFile> LoadProject(string source)
            {
                return(IO.File.Open(May(source), FileMode.Open,
                                    s => ProjectFile.ReadFile(
                                        s.Select(ss => new BinaryReader(ss)),
                                        May(source),
                                        May(Sender))));
            }

            return(from load in obj
                   let id = load.ProjectFile.OperationId
                            let source = load.ProjectFile.Source
                                         select Finally(() =>
                                                        Match(
                                                            Try(() =>
                                                                from proj in LoadProject(source)
                                                                select new LoadedProjectFile(id, proj, Maybe <Exception> .Nothing, true)),
                                                            e => new LoadedProjectFile(id, ProjectFile.FromSource(source, Sender), May(e), false)),
                                                        () => Context.Stop(Self)));
        }