JSFiddle - React, Tailwind, and code Playground

by Egor Jvechkin

JavaScript

// 1. Реализуйте класс Mailbox
// Доп. задания:
// 2. Если считаете, что Mailbox не хватает еще каких-то технических функций для более готового к использованию API, добавьте их или напишите, что бы вы добавили. Если считаете, что данное API содержит какие-то проблемы с точки зрения проектирования, опишите их и предложите рефакторинг.
// 3. Какие части кода можно было бы концептуально абстрагировать из реализации Mailbox и сделать их переиспользуемыми? Попробуйте максимально разбить реализацию на переиспользуемые части.
const Singlename = class _Singlename {
	constructor(name) {
  	if (!_Singlename._instances) { 
    	Object.defineProperty(_Singlename, '_instances', {
    		configurable: false,
    		writable: false,
        value: new Map()
    	});
    }
  	if (_Singlename._instances.has(name)) { return _Singlename._instances.get(name); }
    
    _Singlename._instances.set(name, this)
  }
}

class Mailbox extends Singlename {
	constructor(name) {
  	super(name);
    
  	this.notifyHooks = []
  	this.preHooks = []
  }
  
  pre(hook) {
    this.preHooks.push(hook);
  }
  
  notify(hook) {
    this.notifyHooks.push(hook);
  }
  
  sendMail(message) {
    let counter = -1;
    
    const needToSend = this.preHooks.every((preHook, index) => {
      preHook.call(this, message, (m) => {
        message = m;
        counter += 1;
      });
      return (counter === index);
    });
    
    needToSend && this.notifyHooks.forEach(notify => notify.call(this, message));
  }
  
}



const mailbox = new Mailbox('name')

mailbox.pre(function (mail, send) { // pre-хуков может быть несколько или не быть совсем. Если хуков несколько, то необходимо чтобы все подтвердили отправку. 
  if (mail !== 'spam') { // если письмо удовлетворяет условию, то только тогда подтверждаем его отправку
    send(mail)
  }
})

mailbox.pre(function (mail, send) { // pre-хуков может быть несколько или не быть совсем. Если хуков несколько, то необходимо чтобы все подтвердили отправку. 
  if (mail !==...