001    package fj.data.fingertrees;
002    
003    import fj.data.vector.V2;
004    import fj.F;
005    import fj.P2;
006    
007    /**
008     * A two-element inner tree node.
009     */
010    public final class Node2<V, A> extends Node<V, A> {
011      private final V2<A> as;
012    
013      Node2(final Measured<V, A> m, final V2<A> as) {
014        super(m, m.sum(m.measure(as._1()), m.measure(as._2())));
015        this.as = as;
016      }
017    
018      @Override public <B> B foldRight(final F<A, F<B, B>> aff, final B z) {
019        return aff.f(as._1()).f(aff.f(as._2()).f(z));
020      }
021    
022      @Override public <B> B foldLeft(final F<B, F<A, B>> bff, final B z) {
023        return bff.f(bff.f(z).f(as._1())).f(as._2());
024      }
025    
026      public Digit<V, A> toDigit() {
027        return new Two<V, A>(measured(), as);
028      }
029    
030      @Override public P2<Integer, A> lookup(final F<V, Integer> o, final int i) {
031        return null; // TODO
032      }
033    
034      public <B> B match(final F<Node2<V, A>, B> n2, final F<Node3<V, A>, B> n3) {
035        return n2.f(this);
036      }
037    
038      public V2<A> toVector() {
039        return as;
040      }
041    }