/**
 * 공용 기능 모듈
 * @module common
 */

// @ts-check

const request = require('request-promise');
const LRU = require('lru-cache');
const sInstance = Symbol('common.getInstance');

/** @see https://github.com/request/request-promise */

exports.request = request;

/** @see https://github.com/isaacs/node-lru-cache */
exports.LRU = LRU;

/**
 * Toast 서브클래스 싱글턴 구현
 * 각 서브클래스 인스턴스 객체를 필요한 때 1회만 생성하기 위함
 * @template T
 * @param {import('./Toast')} oToast 
 * @param {string} name 
 * @param {{ new(oToast: import('./Toast')): T }} cls Class
 * @returns {T}
 */
exports.getInstance = (oToast, name, cls) => {

   const container = oToast[sInstance] || (oToast[sInstance] = {});

   return container[name] = container[name] || new cls(oToast);

};