/**
 * Subscribe
 *
 * Contains a class meant to be extended in order to easily add the ability for
 * users to subscribe / unsubscribe to changes on the instance
 *
 * @author Chris Nasr <chris@ouroboroscoding.com>
 * @copyright Ouroboros Coding Inc.
 * @created 2023-02-24
 */
import { Clone } from '@ouroboros/clone';
export type SubscribeCallback = (data: any) => void;
export type SubscribeReturn = {
    data: any;
    unsubscribe: () => boolean;
};
/**
 * Subscribe
 *
 * This class contains methods to manage subscription to the instance
 *
 * @name Subscribe
 * @access public
 */
export default class Subscribe extends Clone {
    protected subscribeCallbacks: SubscribeCallback[];
    protected subscribeData: any;
    protected cloneFlag: boolean;
    /**
     * Constructor
     *
     * Creates a new instance
     *
     * @name Subscribe
     * @access public
     * @param data The initial data to
     * @param cloneFlag Optional, set to false to always return real data
     */
    constructor(data?: any, cloneFlag?: boolean);
    /**
     * Get
     *
     * Returns a copy of the data currently stored
     *
     * @name get
     * @access public
     * @returns whatever the instance is currently storing as data
     */
    get(): any;
    /**
     * Notify
     *
     * Calls all the subscriber callbacks
     *
     * @name notify
     * @access public
     * @returns void
     */
    notify(): void;
    /**
     * Set
     *
     * If the data has changed, stores the new data and sends a copy of it to
     * all callbacks (if notify is not set to false), then returns true.
     * Else, returns false and does nothing
     *
     * @name set
     * @access public
     * @param data The new data to set and then send
     * @param notify Set to false to not notify subscribers
     * @returns bool
     */
    set(data: any, notify?: boolean): boolean;
    /**
     * Subscribe
     *
     * Stores a callback function to be called whenever the option data needs
     * to change
     *
     * @name subscribe
     * @access public
     * @param callback The function to call when data changes
     * @returns current data
     */
    subscribe(callback: SubscribeCallback): SubscribeReturn;
    /**
     * Unsubscribe
     *
     * Not meant to be called publicaly, but kept as such in order to support
     * code using old style subscrube/unsubscribe methods. Searches for the
     * callback and then removes it from the list if found.
     *
     * @name unsubscribe
     * @access public
     * @param callback The function to look for to remove
     * @returns if the callback was removed or not
     */
    unsubscribe(callback: SubscribeCallback): boolean;
}
