class TriAccumulator<A, B, C, ResultContainer_, Result_> extends AbstractAccumulator<ResultContainer_, Result_> {

    private final String varA;
    private final String varB;
    private final String varC;
    private final QuadFunction<ResultContainer_, A, B, C, Runnable> accumulator;

    private Function<BaseTuple, A> valueExtractorA;
    private Function<BaseTuple, B> valueExtractorB;
    private Function<BaseTuple, C> valueExtractorC;

    public TriAccumulator(Variable<A> varA, Variable<B> varB, Variable<C> varC,
            TriConstraintCollector<A, B, C, ResultContainer_, Result_> collector) {
        super(collector.supplier(), collector.finisher());
        this.accumulator = Objects.requireNonNull(collector.accumulator());
        this.varA = varA.getName();
        this.varB = varB.getName();
        this.varC = varC.getName();
    }

    @Override
    protected Runnable accumulate(ResultContainer_ context, BaseTuple leftTuple, FactHandle handle,
            Declaration[] innerDeclarations) {
        A a = valueExtractorA.apply(leftTuple);
        B b = valueExtractorB.apply(leftTuple);
        C c = valueExtractorC.apply(leftTuple);
        return accumulator.apply(context, a, b, c);
    }

    @Override
    protected void initialize(BaseTuple leftTuple, Declaration[] innerDeclarations) {<FILL_FUNCTION_BODY>}

}

        for (Declaration declaration : innerDeclarations) {
            if (declaration.getBindingName().equals(varA)) {
                valueExtractorA = getValueExtractor(declaration, leftTuple);
            } else if (declaration.getBindingName().equals(varB)) {
                valueExtractorB = getValueExtractor(declaration, leftTuple);
            } else if (declaration.getBindingName().equals(varC)) {
                valueExtractorC = getValueExtractor(declaration, leftTuple);
            }
        }
    
<methods>public final java.lang.Object accumulate(java.lang.Object, java.lang.Object, BaseTuple, FactHandle, Declaration[], Declaration[], ValueResolver) ,public final java.lang.Object createContext() ,public final java.lang.Object createWorkingMemoryContext() ,public final Result_ getResult(java.lang.Object, java.lang.Object, BaseTuple, Declaration[], ValueResolver) ,public final ResultContainer_ init(java.lang.Object, java.lang.Object, BaseTuple, Declaration[], ValueResolver) ,public final boolean supportsReverse() ,public final boolean tryReverse(java.lang.Object, java.lang.Object, BaseTuple, FactHandle, java.lang.Object, Declaration[], Declaration[], ValueResolver) <variables>private final non-sealed Supplier<ResultContainer_> containerSupplier,private final non-sealed Function<ResultContainer_,Result_> finisher,private volatile boolean initialized