JSFiddle - React, Tailwind, and code Playground

by Stepan Parunashvili

JavaScript

function identity(x) {
  return x;
}

function toPromise(value) {
  if (value instanceof MyPromise) {
    return value;
  } else {
    return new MyPromise((resolve, reject) => resolve(value));
  }
}

class MyPromise {
  constructor(fn) {
    // status -- 'pending' | 'reject' | 'resolve';
    this.state = {status: 'pending'};
    this.handlers = {
      resolved: null,
      rejected: null,
    };
    this.queue = [];
    const completePromises = (ps) => {
      const {status, value} = this.state;
      const doAction = unwrappedV => {
        ps.forEach(p => {
          const f = p.handlers[status] || identity;
          const res = f(value);
          p[status](res);
        });
      }

      if (value instanceof MyPromise) {
        value.then(
          x => doAction(x),
          x => doAction(x),
        );
      }
    }
    this.states = {
      pending: {
        then: (succCb, failCb) => {
          const p = new MyPromise();
          p.handlers = {resolve: succCb, reject: failCb};
          this.queue.push(p);
          return p;
        },
        resolve: (v) => {
          this.state = {status: 'resolve', value: v};
          completePromises(this.queue);
        },
        reject: (v) => {
          this.state = {status: 'reject', value: v};
          completePromises(this.queue);
        }
      },
      rejected: {
        then: (succCb, failCb) => {

        },
        resolve: (v) => {

        },
        reject: (v) => {

        },
        finally: () => {
          
        }
      },
      resolved: {
        then: (succCb, failCb) => {

        },
        resolve: (v) => {

        },
        reject: (v) => {

        }
      }
    }
    this.then = (succCb, failCb) => {
      return this.states[this.state.status].then(succCb, failCb);
    }
    this.resolve = (v) => {
      this.states[this.state.status].resolve(v);
    }
    this.reject = (v) => {
      this.states[this.state.status].reject(v);
    }

    fn && fn(this.resolve,...