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