Advertisement
Guest User

OrderedPersistentSet with IEditableCollection support

a guest
Mar 14th, 2011
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.87 KB | None | 0 0
  1. package clojure.lang;
  2.  
  3. import java.io.Serializable;
  4. import java.util.Collection;
  5. import java.util.Iterator;
  6. import java.util.Set;
  7. import java.util.concurrent.Callable;
  8.  
  9. public class PersistentOrderedSet extends AFn implements IObj,
  10.         IEditableCollection, IPersistentSet, Counted, IFn, IMeta,
  11.         IPersistentCollection, Seqable, Serializable, Iterable, Runnable,
  12.         Collection, Callable, Set {
  13.  
  14.     private static final long serialVersionUID = 2231700681270951733L;
  15.  
  16.     static public final PersistentOrderedSet EMPTY = new PersistentOrderedSet(
  17.             null, PersistentHashSet.EMPTY, PersistentVector.EMPTY);
  18.  
  19.     final IPersistentMap _meta;
  20.     final IPersistentSet items;
  21.     final IPersistentVector order;
  22.  
  23.     protected PersistentOrderedSet(IPersistentMap meta, IPersistentSet items,
  24.             IPersistentVector order) {
  25.         this._meta = meta;
  26.         this.items = items;
  27.         this.order = order;
  28.     }
  29.  
  30.     static public PersistentOrderedSet create(ISeq items) {
  31.         PersistentOrderedSet set = EMPTY;
  32.         for (; items != null; items = items.next()) {
  33.             set = (PersistentOrderedSet) set.cons(items.first());
  34.         }
  35.         return set;
  36.     }
  37.  
  38.     public IPersistentSet disjoin(Object item) throws Exception {
  39.         if (!contains(item)) {
  40.             return this;
  41.         }
  42.  
  43.         PersistentVector.TransientVector new_order = PersistentVector.EMPTY
  44.                 .asTransient();
  45.         ISeq s = seq();
  46.         for (; s != null; s = s.next()) {
  47.             if (s.first() != item) {
  48.                 new_order = new_order.conj(s.first());
  49.             }
  50.         }
  51.         return new PersistentOrderedSet(_meta, items.disjoin(item),
  52.                 new_order.persistent());
  53.     }
  54.  
  55.     public IPersistentSet cons(Object item) {
  56.         if (contains(item)) {
  57.             return this;
  58.         }
  59.         return new PersistentOrderedSet(_meta,
  60.                 (IPersistentSet) items.cons(item), order.cons(item));
  61.     }
  62.  
  63.     public IPersistentCollection empty() {
  64.         return EMPTY.withMeta(meta());
  65.     }
  66.  
  67.     public PersistentOrderedSet withMeta(IPersistentMap meta) {
  68.         return new PersistentOrderedSet(meta, items, order);
  69.     }
  70.  
  71.     public IPersistentMap meta() {
  72.         return _meta;
  73.     }
  74.  
  75.     @Override
  76.     public String toString() {
  77.         return RT.printString(this);
  78.     }
  79.  
  80.     @Override
  81.     public Object get(Object key) {
  82.         return items.get(key);
  83.     }
  84.  
  85.     @Override
  86.     public boolean contains(Object key) {
  87.         return items.contains(key);
  88.     }
  89.  
  90.     @Override
  91.     public boolean containsAll(Collection c) {
  92.         for (Object item : c) {
  93.             if (!contains(item)) {
  94.                 return false;
  95.             }
  96.         }
  97.         return true;
  98.     }
  99.  
  100.     @Override
  101.     public int count() {
  102.         return order.count();
  103.     }
  104.  
  105.     @Override
  106.     public int size() {
  107.         return count();
  108.     }
  109.  
  110.     @Override
  111.     public boolean isEmpty() {
  112.         return count() == 0;
  113.     }
  114.  
  115.     @Override
  116.     public ISeq seq() {
  117.         return RT.seq(order);
  118.     }
  119.  
  120.     @Override
  121.     public Iterator iterator() {
  122.         return new SeqIterator(seq());
  123.     }
  124.  
  125.     @Override
  126.     public Object invoke(Object arg1) throws Exception {
  127.         return get(arg1);
  128.     }
  129.  
  130.     @Override
  131.     public boolean equals(Object obj) {
  132.         if (this == obj) {
  133.             return true;
  134.         }
  135.         if (!(obj instanceof Set)) {
  136.             return false;
  137.         }
  138.         Set s = (Set) obj;
  139.  
  140.         if (s.size() != count()) {
  141.             return false;
  142.         }
  143.         return containsAll(s);
  144.     }
  145.  
  146.     @Override
  147.     public boolean equiv(Object obj) {
  148.         return equals(obj);
  149.     }
  150.  
  151.     @Override
  152.     public Object[] toArray() {
  153.         return RT.seqToArray(seq());
  154.     }
  155.  
  156.     @Override
  157.     public Object[] toArray(Object[] a) {
  158.         if (count() > a.length) {
  159.             return toArray();
  160.         }
  161.  
  162.         ISeq s = seq();
  163.         for (int i = 0; s != null; ++i, s = s.next()) {
  164.             a[i] = s.first();
  165.         }
  166.         if (a.length > count()) {
  167.             a[count()] = null;
  168.         }
  169.         return a;
  170.     }
  171.  
  172.     @Override
  173.     public boolean add(Object o) {
  174.         throw new UnsupportedOperationException();
  175.     }
  176.  
  177.     @Override
  178.     public boolean remove(Object o) {
  179.         throw new UnsupportedOperationException();
  180.     }
  181.  
  182.     @Override
  183.     public boolean addAll(Collection c) {
  184.         throw new UnsupportedOperationException();
  185.     }
  186.  
  187.     @Override
  188.     public void clear() {
  189.         throw new UnsupportedOperationException();
  190.     }
  191.  
  192.     @Override
  193.     public boolean retainAll(Collection c) {
  194.         throw new UnsupportedOperationException();
  195.     }
  196.  
  197.     @Override
  198.     public boolean removeAll(Collection c) {
  199.         throw new UnsupportedOperationException();
  200.     }
  201.  
  202.     @Override
  203.     public ITransientCollection asTransient() {
  204.         return new TransientOrderedSet(
  205.                 (ITransientSet) ((PersistentHashSet) items).asTransient(),
  206.                 ((PersistentVector) order).asTransient());
  207.     }
  208.  
  209.     static final class TransientOrderedSet extends AFn implements ITransientSet {
  210.         ITransientSet items;
  211.         ITransientVector order;
  212.  
  213.         TransientOrderedSet(ITransientSet items, ITransientVector order) {
  214.             this.items = items;
  215.             this.order = order;
  216.         }
  217.  
  218.         public IPersistentCollection persistent() {
  219.             return new PersistentOrderedSet(null,
  220.                     (IPersistentSet) items.persistent(),
  221.                     (IPersistentVector) order.persistent());
  222.         }
  223.  
  224.         @Override
  225.         public ITransientCollection conj(Object obj) {
  226.             if (items.contains(obj)) {
  227.                 return this;
  228.             }
  229.  
  230.             ITransientSet s = (ITransientSet) items.conj(obj);
  231.             if (s != items) {
  232.                 this.items = s;
  233.             }
  234.             ITransientVector v = (ITransientVector) order.conj(obj);
  235.             if (v != order) {
  236.                 this.order = v;
  237.             }
  238.  
  239.             return this;
  240.         }
  241.  
  242.         @Override
  243.         public int count() {
  244.             return items.count();
  245.         }
  246.  
  247.         @Override
  248.         public boolean contains(Object obj) {
  249.             return items.contains(obj);
  250.         }
  251.  
  252.         @Override
  253.         public ITransientSet disjoin(Object obj) throws Exception {
  254.             if (!items.contains(obj)) {
  255.                 return this;
  256.             }
  257.             ITransientSet set = items.disjoin(obj);
  258.             if (set != items) {
  259.                 this.items = set;
  260.             }
  261.  
  262.             PersistentVector.TransientVector new_order = PersistentVector.EMPTY
  263.                     .asTransient();
  264.             ISeq s = order.persistent().seq();
  265.             for (; s != null; s = s.next()) {
  266.                 if (s.first() != obj) {
  267.                     new_order = new_order.conj(s.first());
  268.                 }
  269.             }
  270.             if (order != new_order) {
  271.                 order = new_order;
  272.             }
  273.  
  274.             return this;
  275.         }
  276.  
  277.         @Override
  278.         public Object get(Object key) {
  279.             return items.get(key);
  280.         }
  281.     }
  282. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement