public Pipe <TOut> Do <TProcessor, TOut>() where TProcessor : IFilter <T, TOut> { Pipe <TOut> result; if (Obj.Success) { var processor = PipeFactory.GetProcessor <TProcessor>(); var processingResult = processor.Process(Obj.Value); result = new Pipe <TOut>(PipeFactory).Use(processingResult); } else { result = new Pipe <TOut>(PipeFactory).Use(Result.Fail <TOut>(Obj.Error)); } return(result); }