ReadonlySingleton only requires a ReadonlyStorage and exposes only the methods of Singleton that don't modify state.
Singleton effectively combines PrefixedStorage with TypedStorage to work on a single storage key. It performs the key_prefix transformation on the given name to ensure no collisions, and then provides the standard TypedStorage accessors, without requiring a key (which is defined in the constructor)
currval returns the last value returned by nextval. If the sequence has never been used, then it will return 0.
nextval increments the counter by 1 and returns the new value. On the first time it is called (no sequence info in db) it will return 1.
Sequence creates a custom Singleton to hold an empty sequence