main
 1using System;
 2using System.Collections.Generic;
 3
 4namespace gorilla.commons.utility
 5{
 6    static public class SpecificationExtensions
 7    {
 8        static public IEnumerable<T> that_satisfy<T>(this IEnumerable<T> items_to_peek_in_to,
 9                                                     Predicate<T> criteria_to_satisfy)
10        {
11            foreach (var item in items_to_peek_in_to ?? new List<T>())
12                if (item.satisfies(criteria_to_satisfy)) yield return item;
13        }
14
15        static public bool satisfies<T>(this T item_to_interrogate, Predicate<T> criteria_to_satisfy)
16        {
17            return criteria_to_satisfy(item_to_interrogate);
18        }
19
20        static public bool satisfies<T>(this T item_to_validate, Specification<T> criteria_to_satisfy)
21        {
22            return item_to_validate.satisfies(criteria_to_satisfy.is_satisfied_by);
23        }
24
25        static public Specification<T> and<T>(this Specification<T> left, Specification<T> right)
26        {
27            return new PredicateSpecification<T>(x => left.is_satisfied_by(x) && right.is_satisfied_by(x));
28        }
29
30        static public Specification<T> or<T>(this Specification<T> left, Specification<T> right)
31        {
32            return new PredicateSpecification<T>(x => left.is_satisfied_by(x) || right.is_satisfied_by(x));
33        }
34
35        static public Specification<T> not<T>(this Specification<T> original)
36        {
37            return new PredicateSpecification<T>(x => !original.is_satisfied_by(x));
38        }
39    }
40}