/**
 * @class PromiseAdapter
 * @description
 * Adapter for the primary promise operations.
 *
 * Provides compatibility with promise libraries that cannot be recognized automatically,
 * via functions that implement the primary operations with promises:
 *
 *  - construct a new promise with a callback function
 *  - resolve a promise with some result data
 *  - reject a promise with a reason
 *
 * #### Example
 *
 * Below is an example of setting up a [client-side]{@tutorial client} adapter for AngularJS $q.
 *
 * ```js
 * const spexLib = require('spex'); // or include client-side spex.js
 *
 * const adapter = new spexLib.PromiseAdapter(
 *    cb => $q(cb), // creating a new promise;
 *    data => $q.when(data), // resolving a promise;
 *    reason => $q.reject(reason) // rejecting a promise;
 *    );
 *
 * const spex = spexLib(adapter);
 * ```
 *
 * @param {Function} create
 * A function that takes a callback parameter and returns a new promise object.
 * The callback parameter is expected to be `function(resolve, reject)`.
 *
 * Passing in anything other than a function will throw `Adapter requires a function to create a promise.`
 *
 * @param {Function} resolve
 * A function that takes an optional data parameter and resolves a promise with it.
 *
 * Passing in anything other than a function will throw `Adapter requires a function to resolve a promise.`
 *
 * @param {Function} reject
 * A function that takes an optional error parameter and rejects a promise with it.
 *
 * Passing in anything other than a function will throw `Adapter requires a function to reject a promise.`
 *
 * @see {@tutorial client}
 *
 */
class PromiseAdapter {
    constructor(create, resolve, reject) {
        this.create = create;
        this.resolve = resolve;
        this.reject = reject;

        if (typeof create !== 'function') {
            throw new TypeError('Adapter requires a function to create a promise.');
        }

        if (typeof resolve !== 'function') {
            throw new TypeError('Adapter requires a function to resolve a promise.');
        }

        if (typeof reject !== 'function') {
            throw new TypeError('Adapter requires a function to reject a promise.');
        }
    }
}

module.exports = PromiseAdapter;