import '../../assert/js/assert.js';
import '../../globals.js';
import StrictOmit from '../../phet-core/js/types/StrictOmit.js';
import { PhetioObjectOptions } from '../../tandem/js/PhetioObject.js';
import IOType from '../../tandem/js/types/IOType.js';
import { EmitterOptions } from './Emitter.js';
import NumberProperty, { NumberPropertyOptions } from './NumberProperty.js';
import TEmitter from './TEmitter.js';
type ObservableArrayListener<T> = (element: T) => void;
type Predicate<T> = (element: T) => boolean;
type ObservableArrayStateObject<T> = {
    array: any[];
};
type FakeRandom<T> = {
    shuffle: (arr: T[]) => T[];
};
type SelfOptions<T> = {
    length?: number;
    elements?: T[];
    hasListenerOrderDependencies?: boolean;
    elementAddedEmitterOptions?: StrictOmit<EmitterOptions, 'tandem' | 'parameters' | 'phetioReadOnly'>;
    elementRemovedEmitterOptions?: StrictOmit<EmitterOptions, 'tandem' | 'parameters' | 'phetioReadOnly'>;
    lengthPropertyOptions?: StrictOmit<NumberPropertyOptions, 'tandem' | 'numberType' | 'phetioReadOnly'>;
};
export type ObservableArrayOptions<T> = SelfOptions<T> & PhetioObjectOptions;
type ObservableArray<T> = {
    get: (index: number) => T;
    addItemAddedListener: (listener: ObservableArrayListener<T>) => void;
    removeItemAddedListener: (listener: ObservableArrayListener<T>) => void;
    addItemRemovedListener: (listener: ObservableArrayListener<T>) => void;
    removeItemRemovedListener: (listener: ObservableArrayListener<T>) => void;
    add: (element: T) => void;
    addAll: (elements: T[]) => void;
    remove: (element: T) => void;
    removeAll: (elements: T[]) => void;
    clear: () => void;
    count: (predicate: Predicate<T>) => number;
    find: (predicate: Predicate<T>, fromIndex?: number) => T | undefined;
    shuffle: (random: FakeRandom<T>) => void;
    getArrayCopy: () => T[];
    dispose: () => void;
    toStateObject: () => ObservableArrayStateObject<T>;
    applyState: (state: ObservableArrayStateObject<T>) => void;
    elementAddedEmitter: TEmitter<[T]>;
    elementRemovedEmitter: TEmitter<[T]>;
    lengthProperty: NumberProperty;
    reset: () => void;
    phetioElementType?: IOType;
} & T[];
declare const createObservableArray: {
    <T>(providedOptions?: ObservableArrayOptions<T>): ObservableArray<T>;
    ObservableArrayIO: (parameterType: IOType) => IOType;
};
/**
 * ObservableArrayIO is the IOType for ObservableArrayDef. It delegates most of its implementation to ObservableArrayDef.
 * Instead of being a parametric type, it leverages the phetioElementType on ObservableArrayDef.
 */
declare const ObservableArrayIO: (parameterType: IOType) => IOType;
export default createObservableArray;
export { ObservableArrayIO };
export type { ObservableArray };
//# sourceMappingURL=createObservableArray.d.ts.map