JSFiddle - React, Tailwind, and code Playground

by Rudolf Mankevich

JavaScript

const ASYNC_INIT = true;

let rerender;

function run(render) {
	rerender = render;
  render()
}

let instance;

function useValue(init) {
	if (instance) {
  	return [instance.ref.current, instance.set];
  }

	let ref = { current: undefined };
  
  if (ASYNC_INIT) {
  	queueMicrotask(() => set(init()));
  } else {
  	set(init());
  }
  
  function set(next) {
  	ref.current = next;
    rerender();
  }
  
  instance = { ref, set };
  return [ref.current, set];
}

run(() => {
  const [value] = useValue(() => x)

  let x = 1;

  console.log(value);
});