store

Installation
npm install @flexbase/store
or
yarn add @flexbase/store
Concepts
The concept behind the store is to separate state management from other application concerns. It is Promise based utilizing an Observer pattern.
Usage
Example data
interface SomeData {
name: string;
id: number;
}
Create a store
const someDataStore = createStore<SomeData>();
const someOtherStore = createStore<number>();
Create Store Options
const someDataStore = createStore<SomeData>({
key?: symbol,
defaultValue?: <SomeData>,
comparer?: StoreComparer<SomeData>,
middleware?: StoreMiddleware<SomeData>[],
persistanceProvider?: PersistanceProvider<SomeData>,
storageManager: StorageManager
});
const someDataStore = createStore<SomeData>(options => {
options
.key(key: symbol | string)
.defaultValue(value: <SomeData>)
.comparer(comparer: StoreComparer<SomeData>)
.middleware(...middleware: StoreMiddleware<SomeData>[])
.persistanceProvider(persistanceProvider: PersistanceProvider<SomeData>)
.storageManager(storageManager: StorageManager)
});
Get store value
const value = getStoreValue(someDataStore);
Set store value
await setStoreValue(someDataStore, { name: 'Test', id: 1 });
await setStoreValue(someOtherStore, 42);
Using a callback
await setStoreValue(someDataStore, _ => {name: 'Test', id: 1});
await setStoreValue(someOtherStore, _ => 42);
await setStoreValue(test, currentValue => (currentValue ? Math.min(42, currentValue) : 0));
Reset store value
let value: number;
const numberStore = createStore<number>({ defaultValue: 42 });
value = storageManager.getValue(numberStore);
await storageManager.setValue(numberStore, 1);
value = storageManager.getValue(numberStore);
await resetStoreValue(numberStore);
value = storageManager.getValue(numberStore);
Get store setter
const setter = getStoreSetter(someDataStore);
await setter({ name: 'Test', id: 1 });
await setter(_ => {name: 'Test', id: 1});
Subscribe
const subscription = subscribeToStore(someDataStore, context => {...});
subscription.unsubscribe();
Persistance
TODO
Middleware
TODO