main
 1using System;
 2using System.Collections.Generic;
 3using System.Linq;
 4
 5namespace jive
 6{
 7  static public class ListExtensions
 8  {
 9    static public IListConstraint<T> add<T>(this ICollection<T> items, T item)
10    {
11      return new ListConstraint<T>(items, item);
12    }
13
14    static public IListConstraint<T> add_range<T>(this ICollection<T> items, IEnumerable<T> item)
15    {
16      return new ListConstraint<T>(items, item.ToArray());
17    }
18  }
19
20  public class ListConstraint<T> : IListConstraint<T>
21  {
22    readonly ICollection<T> items;
23    readonly T[] items_to_add;
24
25    public ListConstraint(ICollection<T> list_to_constrain, params T[] items_to_add)
26    {
27      items = list_to_constrain;
28      this.items_to_add = items_to_add;
29      items_to_add.each(list_to_constrain.Add);
30    }
31
32    public void unless(Func<T, bool> predicate)
33    {
34      items_to_add.where(predicate).each(x => items.Remove(x));
35    }
36  }
37
38  public interface IListConstraint<T>
39  {
40    void unless(Func<T, bool> predicate);
41  }
42}