private static ISpecification <T>[] GetFlatArgumentsArray(CompositeSpecificationOperation operation, ISpecification <T>[] arguments) { if (operation != CompositeSpecificationOperation.And && operation != CompositeSpecificationOperation.Or) { return(arguments); } var argsCount = GetFlatArgsCount(operation, arguments); if (argsCount == arguments.Length) { return(arguments); } var res = new ISpecification <T> [argsCount]; var idx = 0; foreach (var arg in GetFlatArgs(operation, arguments)) { res[idx] = arg; ++idx; } return(res); }
/// <summary>Initializes a new instance of the <see cref="CompositeSpecification{T}"/> class.</summary> /// <param name="algebra">The algebra.</param> /// <param name="operation">The operator.</param> /// <param name="arguments">The arguments.</param> public CompositeSpecification(ISpecificationAlgebra <T> algebra, CompositeSpecificationOperation operation, params ISpecification <T>[] arguments ) : base(algebra.GetHighestPrioritizedAlgebra <Specification <T>, ISpecificationAlgebra <T> >(arguments.OfType <IDefineAlgebraicDomain <Specification <T>, ISpecificationAlgebra <T> > >().Select(a => a.Algebra)), null) { Operation = operation; _arguments = GetFlatArgumentsArray(operation, arguments); }
public static bool CanBeRepresentedByCodeOperator(this CompositeSpecificationOperation operation) { switch (operation) { case CompositeSpecificationOperation.And: case CompositeSpecificationOperation.Or: case CompositeSpecificationOperation.XOr: return(true); default: return(false); } }
public static OverloadableCodeBinarySymmetricOperator ToCodeSymmetricBinaryOperator( this CompositeSpecificationOperation operation) { switch (operation) { case CompositeSpecificationOperation.And: return(OverloadableCodeBinarySymmetricOperator.And); case CompositeSpecificationOperation.Or: return(OverloadableCodeBinarySymmetricOperator.Or); case CompositeSpecificationOperation.XOr: return(OverloadableCodeBinarySymmetricOperator.XOr); default: throw new NotSupportedException($"Operator {operation} is not supported."); } }
private static IEnumerable <ISpecification <T> > GetFlatArgs(CompositeSpecificationOperation @operator, IEnumerable <ISpecification <T> > specifications) { foreach (var spec in specifications) { if (spec is ICompositeSpecification <T> composite && composite.Operation == @operator) { foreach (var arg in composite.Arguments) { yield return(arg); } } else { yield return(spec); } } }
private static int GetFlatArgsCount(CompositeSpecificationOperation operation, IEnumerable <ISpecification <T> > specifications) { return(specifications.Sum(spec => spec is ICompositeSpecification <T> composite && composite.Operation == operation ? composite.Arguments.Count : 1)); }