1import {useEffect, useState} from 'react'; 2 3export default class StateMapper<T> { 4 private getFun: () => T; 5 private cbs: Set<Function> = new Set([]); 6 constructor(getFun: () => T) { 7 this.getFun = getFun; 8 } 9 10 notify = () => { 11 this.cbs.forEach(_ => _?.()); 12 }; 13 14 useMappedState = () => { 15 const [_state, _setState] = useState<T>(this.getFun); 16 const updateState = () => { 17 _setState(this.getFun()); 18 }; 19 useEffect(() => { 20 this.cbs.add(updateState); 21 return () => { 22 this.cbs.delete(updateState); 23 }; 24 }, []); 25 return _state; 26 }; 27} 28