// © 2016 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html#License
/*
 *******************************************************************************
 * Copyright (C) 2004-2010, International Business Machines Corporation and    *
 * others. All Rights Reserved.                                                *
 *******************************************************************************
 */

package com.ibm.icu.text;

/**
 * Post processor for RBNF output.
 */
interface RBNFPostProcessor {
    /**
     * Initialization routine for this instance, called once
     * immediately after first construction and never again.
     * @param formatter the formatter that will be using this post-processor
     * @param rules the special rules for this post-procesor
     */
    void init(RuleBasedNumberFormat formatter, String rules);

    /**
     * Work routine.  Post process the output, which was generated by the
     * ruleset with the given name.
     * @param output the output of the main RBNF processing
     * @param ruleSet the rule set originally invoked to generate the output
     */
    void process(StringBuffer output, NFRuleSet ruleSet);
}
