import '../../assert/js/assert.js';
import './PhetioIDUtils.js';
import '../../globals.js';
/**
 * An instrumented class that wraps a function that does "work" that needs to be interoperable with PhET-iO.
 * PhetioAction supports the following features:
 *
 * 1. Data stream support: The function will be wrapped in an `executed` event and added to the data stream, nesting
 * subsequent events the action's "work" cascades to as child events.
 * 2. Interopererability: PhetioActionIO supports the `execute` method so that PhetioAction instances can be executed
 * from the PhET-iO wrapper.
 * 3. It also has an emitter if you want to listen to when the action is done doing its work, https://github.com/phetsims/phet-io/issues/1543
 *
 * @author Michael Kauzmann (PhET Interactive Simulations)
 */
import Emitter from '../../axon/js/Emitter.js';
import IntentionalAny from '../../phet-core/js/types/IntentionalAny.js';
import StrictOmit from '../../phet-core/js/types/StrictOmit.js';
import PhetioDataHandler, { PhetioDataHandlerOptions } from './PhetioDataHandler.js';
import IOType from './types/IOType.js';
type ActionParameter = Exclude<IntentionalAny, undefined | never>;
export type ActionOptions = StrictOmit<PhetioDataHandlerOptions, 'phetioOuterType'>;
declare class PhetioAction<T extends ActionParameter[] = []> extends PhetioDataHandler<T> {
    private readonly action;
    private isExecutingCount;
    private disposeOnExecuteCompletion;
    private disposePhetioAction;
    readonly executedEmitter: Emitter<T>;
    static readonly PhetioActionIO: (parameterTypes: IOType[]) => IOType;
    /**
     * @param action - the function that is called when this PhetioAction occurs
     * @param providedOptions
     */
    constructor(action: (...args: T) => void, providedOptions?: ActionOptions);
    /**
     * Invokes the action.
     * @params - expected parameters are based on options.parameters, see constructor
     */
    execute(...args: T): void;
    /**
     * Note: Be careful about adding disposal logic directly to this function, it is likely preferred to add it to
     * disposePhetioAction instead, see disposeOnExecuteCompletion for details.
     */
    dispose(): void;
}
export default PhetioAction;
//# sourceMappingURL=PhetioAction.d.ts.map