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 }