private static Pipeline AppendToPipeline(Pipeline pipeline, SpecificationContext context, SetDefinition setDefinition, SpecificationResult result) { if (setDefinition is SetDefinitionPredecessorChain predecessorChainSet) { var chain = predecessorChainSet.ToChain(); var targetSetDefinition = chain.TargetSetDefinition; var start = targetSetDefinition.Label; var target = new Label(predecessorChainSet.Role, chain.TargetFactType); var path = new Path(start, target); return(pipeline.AddPath(AddPredecessorSteps(path, chain))); } else if (setDefinition is SetDefinitionJoin joinSet) { var head = joinSet.Head; var tail = joinSet.Tail; var sourceSetDefinition = head.TargetSetDefinition; var source = sourceSetDefinition.Label; var target = joinSet.Label; var path = new Path(source, target); return(pipeline.AddPath(PrependSuccessorSteps(AddPredecessorSteps(path, head), tail))); } else if (setDefinition is SetDefinitionConditional conditionalSet) { var targetSetDefinition = conditionalSet.Source; var start = targetSetDefinition.Label; var childPipeline = CreatePipeline( SpecificationContext.Empty .With(start, SpecificationParser.InstanceOfFact(targetSetDefinition.Type), targetSetDefinition.Type), conditionalSet.Condition.SpecificationResult); var conditional = new Conditional(start, conditionalSet.Condition.Exists, childPipeline); return(pipeline.AddConditional(conditional)); } else { throw new NotImplementedException(); } }