Recently I had a look at tofu library.
Initially it seems this library provides granular typeclasses which provides developer to implement high level logic and substitute corresponding lower level implementation as proposed by tagless final approach.
But env module, for example looks overcomplicated but tecnhically provides reader monad. Definitely this is an acceptable approach, but it seems that monix task dependency introduce all this complexity. Why env contains any side effect specifics?
It is possible to remain all concurrent specifics (functions that loads values) at a high level, and manipilate only with pure values inside env monad. The idea is to split loading configuration and store of pure values (env in that case is just a wrap of this store). Even if some values may change or can be reloaded all this loading mechanics may be implemented outside the entity that just stores current values. In that case env may provide just an implicit context (that is the main goal of reader monad) and all side effects and error handling may be moved to high level (outside the env monad, and implemented in any way and not necessarily based on monix tasks).