import {Mixin} from '$qui/base/mixwith.js'
/** @lends qui.base.SingletonMixin */
const SingletonMixin = Mixin((superclass = Object) => {
    /**
     * A mixin that helps implementing the singleton pattern.
     * @alias qui.base.SingletonMixin
     * @mixin
     */
    class SingletonMixin extends superclass {
        static _instance = null
        static _args = null
        /**
         * @constructs
         * @param {...*} args parent class parameters
         */
        constructor(...args) {
            super(...args)
        }
        /**
         * Prepare the class for instantiation, establishing the constructor arguments.
         *
         * Any arguments passed to this method will be passed to the constructor, when creating the singleton.
         *
         * @param {...*} args arguments to be passed to the constructor
         */
        static setup(...args) {
            this._args = args
            this._instance = null
        }
        /**
         * Return the singleton instance. Instantiates the class on first call.
         * @returns {Object} the instance
         */
        static getInstance() {
            if (this._instance) {
                return this._instance
            }
            /* Make sure setup() has been called */
            if (this._args == null) {
                this.setup()
            }
            // eslint-disable-next-line new-parens
            this._instance = new (this.bind.apply(this, this._args))
            return this._instance
        }
    }
    return SingletonMixin
})
export default SingletonMixin