And if you really wanted to make it 'pure', you could easily write a hook with an explicit return type that wraps the type of the initial value. If you're using typescript, you can then limit the possible types of the generic to only monads.
type State<T> = val as T;
const useStatex = <T>(initialState: T) => {
const [state, setState] = useState(initialState);
return [state, updateState] as [State<T>, (val: T) => void];
}
This new hook, useStatex, has an explicit type definition that indicates something stateful is taking place. Same as Futures. You can take this even further in the typing limiting the generic to only allow certain types for the underlying values to be monads, or even more simply
type State<T> = Promise<T> | Array<T> | Option<T>
So you avoid an extra layer of nesting like
State<Future<Array<T>>>
Point is, there are lots of ways to easily resolve any its not pure! arguments same as any other functional programming concept
eta
The simplest way to limit the return type might even be to just do this
And if you really wanted to make it 'pure', you could easily write a hook with an explicit return type that wraps the type of the initial value. If you're using typescript, you can then limit the possible types of the generic to only monads.
This new hook, useStatex, has an explicit type definition that indicates something stateful is taking place. Same as Futures. You can take this even further in the typing limiting the generic to only allow certain types for the underlying values to be monads, or even more simply So you avoid an extra layer of nesting like Point is, there are lots of ways to easily resolve any its not pure! arguments same as any other functional programming concepteta
The simplest way to limit the return type might even be to just do this