001    package lrs.visitor;
002    
003    import lrs.*;
004    import java.util.*;
005    
006    /**
007     * Algorithm for inserting elements into an LRStruct in order.
008     * @author Mathias Ricken - Copyright 2008 - All rights reserved.
009     */
010    public class InsertInOrder<T> implements IAlgo<T, LRStruct<T>, T> {
011      private Comparator<T> _order;
012    
013      public InsertInOrder(Comparator<T> ord) {
014          _order = ord;
015      }
016    
017      /**
018      * Simply inserts the given parameter n at the front.
019      * @param host an empty LRStruct.
020      * @param n n[0] is an Object to be inserted in order into host,
021      *   based on the given Comparator.
022      * @return LRStruct<T>
023      */
024      public LRStruct<T> emptyCase(LRStruct<T> host, T... n) {
025        return host.insertFront(n[0]);
026      }
027    
028      /**
029      * Based on the comparison between first and n,
030      * inserts at the front or recurs!
031      * @param host a non-empty LRStruct.
032      * @param n n[0] is an Object to be inserted in order into host,
033      *   based on the given Comparator.
034      * @return LRStruct<T>
035      */
036      public LRStruct<T> nonEmptyCase(LRStruct<T> host, T... n) {
037        if (_order.compare(n[0], host.getFirst()) < 0) {
038          return ((LRStruct<T>)host).insertFront(n[0]);
039        }
040        else {
041          return host.getRest().execute(this, n);
042        }
043      }
044    }
045