using System; using System.Collections.Generic; using System.Linq; namespace jive { static public class SpecificationExtensions { static public IEnumerable that_satisfy(this IEnumerable items_to_peek_in_to, Predicate criteria_to_satisfy) { foreach (var item in items_to_peek_in_to ?? Enumerable.Empty()) if (item.satisfies(criteria_to_satisfy)) yield return item; } static public bool satisfies(this T item_to_interrogate, Predicate criteria_to_satisfy) { return criteria_to_satisfy(item_to_interrogate); } static public bool satisfies(this T item_to_validate, Specification criteria_to_satisfy) { return item_to_validate.satisfies(criteria_to_satisfy.is_satisfied_by); } static public Specification and(this Specification left, Specification right) { return new PredicateSpecification(x => left.is_satisfied_by(x) && right.is_satisfied_by(x)); } static public Specification or(this Specification left, Specification right) { return new PredicateSpecification(x => left.is_satisfied_by(x) || right.is_satisfied_by(x)); } static public Specification not(this Specification original) { return new PredicateSpecification(x => !original.is_satisfied_by(x)); } } }