99
1010## typescript-package/state
1111
12- Simple state management for TypeScript.
12+ Simple state management for different types in TypeScript.
1313
1414<!-- npm badge -->
1515[ ![ npm version] [ typescript-package-npm-badge-svg ]] [ typescript-package-npm-badge ]
@@ -22,10 +22,23 @@ Simple state management for TypeScript.
2222
2323* [ Installation] ( #installation )
2424* [ Api] ( #api )
25+ * [ ` Ability ` ] ( #ability )
26+ * [ ` ArrayState ` ] ( #arraystate )
27+ * [ ` BooleanArrayState ` ] ( #booleanarraystate )
28+ * [ ` NamedArrayState ` ] ( #namedarraystate )
29+ * ` NamedBooleanArrayState `
30+ * ` Boolean `
2531 * [ ` BooleanState ` ] ( #booleanstate )
32+ * ` Enum `
2633 * [ ` EnumState ` ] ( #enumstate )
34+ * [ ` BooleanActionObjectState ` ] ( #booleanactionobjectstate )
35+ * ` BooleanObjectState `
36+ * ` NamedObjectState `
37+ * ` ObjectState `
38+ * ` ImmutableState `
2739 * [ ` NullState ` ] ( #nullstate )
2840 * [ ` NumberState ` ] ( #numberstate )
41+ * ` State `
2942* [ Immutability] ( #immutability )
3043 * [ Sealed] ( #sealed )
3144 * [ Frozen] ( #frozen )
@@ -45,15 +58,240 @@ npm install @typescript-package/state
4558
4659``` typescript
4760import {
61+ Ability ,
62+
63+ // Array.
64+ ArrayState ,
65+ BooleanArrayState ,
66+ NamedArrayState ,
67+ NamedBooleanArrayState ,
68+
69+ // Boolean.
70+ Boolean ,
4871 BooleanState ,
72+
73+ // Enum.
74+ Enum ,
4975 EnumState ,
76+
77+ // Object.
78+ BooleanActionObjectState ,
79+ BooleanObjectState ,
80+ NamedObjectState ,
81+ ObjectState ,
82+
5083 NullState ,
5184 NumberState ,
5285 ImmutableState ,
5386 State
5487} from ' @typescript-package/state' ;
5588```
5689
90+ ### ` Ability `
91+
92+ ``` typescript
93+ import { Ability } from ' @typescript-package/state' ;
94+
95+ // Extend the Ability class for a specific type
96+ export class Connection extends Ability {}
97+
98+ // Initialize the connection.
99+ const connection = new Connection ();
100+
101+ // Disables the connection.
102+ connection .disable ();
103+ connection .isDisabled ();
104+
105+ // Enables the connection.
106+ connection .enable ();
107+ connection .isEnabled ();
108+ ```
109+
110+ ### ` ArrayState `
111+
112+ ``` typescript
113+ import { ArrayState } from ' @typescript-package/state' ;
114+
115+ // Extend the ArrayState class for a specific type
116+ export class Numbers extends ArrayState <number > {
117+ // Additional custom methods specific to Numbers can be added if needed
118+ }
119+
120+ // Initialize `Numbers`.
121+ const numbers = new Numbers ([27 , 28 , 29 ]);
122+
123+ // Append a number to the array state
124+ numbers .append (30 );
125+ console .log (numbers .state ); // Output: [27, 28, 29, 30]
126+
127+ // Insert a number at a specific index
128+ numbers .insert (2 , 99 );
129+ console .log (numbers .state ); // Output: [27, 28, 99, 29, 30]
130+
131+ // Remove a number by index
132+ numbers .remove (1 );
133+ console .log (numbers .state ); // Output: [27, 99, 29, 30]
134+
135+ // Pick specific indexes
136+ const picked = numbers .pick (0 , 2 );
137+ console .log (picked ); // Output: [27, 29]
138+
139+ // Swap two elements
140+ numbers .swap (1 , 3 );
141+ console .log (numbers .state ); // Output: [27, 30, 29, 99]
142+
143+ // Reset the state to its initial state
144+ numbers .reset ();
145+ console .log (numbers .state ); // Output: [27, 28, 29]
146+ ```
147+
148+ A simple queue implementation.
149+
150+ ``` typescript
151+ import { ArrayState } from ' @typescript-package/state' ;
152+
153+ // Extend the ArrayState class for a specific type
154+ export class Queue extends ArrayState <number > {
155+ /**
156+ * Adds an item to the end of the queue (enqueue operation).
157+ * @param {number} value - The number to add to the queue.
158+ * @returns {this}
159+ */
160+ public enqueue(value : number ): this {
161+ return this .append (value );
162+ }
163+
164+ /**
165+ * Removes and returns the item at the front of the queue (dequeue operation).
166+ * @returns {number | undefined} - The dequeued number or undefined if the queue is empty.
167+ */
168+ public dequeue(): number | undefined {
169+ const front = this .first ();
170+ this .remove (0 ); // Remove the first element
171+ return front ;
172+ }
173+
174+ /**
175+ * Returns the item at the front of the queue without removing it.
176+ * @returns {number | undefined} - The number at the front of the queue.
177+ */
178+ public peek(): number | undefined {
179+ return this .first ();
180+ }
181+
182+ /**
183+ * Checks if the queue is empty.
184+ * @returns {boolean} - True if the queue is empty, false otherwise.
185+ */
186+ public isEmpty(): boolean {
187+ return this .length === 0 ;
188+ }
189+ }
190+
191+ // Initialize `Queue`.
192+ const queue = new Queue ([27 , 28 , 29 ]);
193+
194+ // Enqueue a number
195+ queue .enqueue (30 );
196+ console .log (queue .state ); // Output: [27, 28, 29, 30]
197+
198+ // Dequeue a number
199+ const dequeued = queue .dequeue ();
200+ console .log (dequeued ); // Output: 27
201+ console .log (queue .state ); // Output: [28, 29, 30]
202+
203+ // Peek at the front of the queue
204+ const front = queue .peek ();
205+ console .log (front ); // Output: 28
206+
207+ // Check if the queue is empty
208+ console .log (queue .isEmpty ()); // Output: false
209+
210+ // Dequeue all items
211+ queue .dequeue ();
212+ queue .dequeue ();
213+ queue .dequeue ();
214+ console .log (queue .isEmpty ()); // Output: true
215+ ```
216+
217+ ### ` BooleanArrayState `
218+
219+ ``` typescript
220+ import { BooleanArrayState as AbstractBooleanArrayState } from ' @typescript-package/state' ;
221+
222+ // Extend the AbstractBooleanArrayState class for a specific type
223+ export class BooleanArrayState extends AbstractBooleanArrayState {
224+ // Additional custom methods specific to BooleanArrayState can be added if needed
225+ }
226+
227+ let booleanArrayState = new BooleanArrayState (false , false , true , true );
228+
229+ // Sets all values to `false`.
230+ booleanArrayState .false ();
231+ console .log (booleanArrayState .state ); // Output: [false, false, false, false]
232+
233+ // Toggles all values to `true`.
234+ booleanArrayState .toggle ();
235+ console .log (booleanArrayState .state ); // Output: [true, true, true, true]
236+
237+ // Toggles all values to `false`.
238+ booleanArrayState .toggle ();
239+ console .log (booleanArrayState .state ); // Output: [false, false, false, false]
240+
241+ // Sets all values to `true`.
242+ booleanArrayState .true ();
243+ console .log (booleanArrayState .state ); // Output: [true, true, true, true]
244+ ```
245+
246+ ### ` NamedArrayState `
247+
248+ ``` typescript
249+ import { NamedArrayState } from ' @typescript-package/state' ;
250+
251+ // Extend the NamedArrayState class for a specific type
252+ export class AppConfiguration extends NamedArrayState <' theme' | ' language' | ' notifications' , string | boolean > {
253+ constructor () {
254+ super (
255+ [' theme' , ' language' , ' notifications' ], // Names of the configuration settings
256+ [' dark' , ' en' , true ] // Default values
257+ );
258+ }
259+
260+ /**
261+ * Updates the value of a specific configuration by name.
262+ * @param {string} name - The name of the configuration to update.
263+ * @param {string | boolean} value - The new value to set.
264+ */
265+ public updateConfiguration(name : ' theme' | ' language' | ' notifications' , value : string | boolean ) {
266+ this .update (this .indexOf (name ), value );
267+ }
268+ }
269+
270+ // Initialize.
271+ const config = new AppConfiguration ();
272+
273+ // View the current state as an object
274+ console .log (config .toObject ()); // Output: { theme: 'dark', language: 'en', notifications: true }
275+
276+ // Get the value of a specific setting
277+ console .log (config .get (' theme' )); // Output: 'dark'
278+
279+ // Update a specific configuration setting
280+ config .updateConfiguration (' theme' , ' light' );
281+ console .log (config .get (' theme' )); // Output: 'light'
282+
283+ // Selecting multiple configuration options
284+ const selectedValues = config .select (' theme' , ' language' );
285+ console .log (selectedValues ); // Output: ['light', 'en']
286+
287+ // Retrieve state with names as tuples
288+ console .log (config .stateWithNames ); // Output: [['theme', 'light'], ['language', 'en'], ['notifications', true]]
289+
290+ // Reset the configuration state to its initial value
291+ config .reset ();
292+ console .log (config .toObject ()); // Output: { theme: 'dark', language: 'en', notifications: true }
293+ ```
294+
57295### ` BooleanState `
58296
59297``` typescript
@@ -101,7 +339,6 @@ export class ActiveEnum extends EnumState<typeof Active, Active> {
101339 constructor (state : Active ) {
102340 super (state , Active );
103341 }
104-
105342}
106343
107344// Initialize.
@@ -111,6 +348,37 @@ const activeEnum = new ActiveEnum(Active.No);
111348activeEnum .is (Active .No )
112349```
113350
351+ ### ` BooleanActionObjectState `
352+
353+ ``` typescript
354+ import { BooleanActionObjectState } from ' @typescript-package/state' ;
355+
356+ // Extend the BooleanActionObjectState class for a specific type
357+ export class Connection <Names extends PropertyKey , Actions extends string > extends BooleanActionObjectState <Names , Actions > {
358+ /**
359+ * Checks whether connection is connected.
360+ * @returns {boolean}
361+ */
362+ public isConnected() {
363+ return this .is (" connected" as any , true );
364+ }
365+ }
366+ // Initialize the `Connection` with state `connected` and actions `connect` and `disconnect`.
367+ const connection = new Connection ([' connected' ], [' connect' , ' disconnect' ]);
368+
369+ // Dispatches the `connect` action.
370+ connection .dispatch (' connect' );
371+ console .log (connection .isConnected ()); // Output: true
372+
373+ // Dispatches the `disconnect` action.
374+ connection .dispatch (' disconnect' );
375+ console .log (connection .isConnected ()); // Output: false
376+
377+ // Dispatches the `connect` action.
378+ connection .dispatch (' connect' );
379+ console .log (connection .isConnected ()); // Output: true
380+ ```
381+
114382### ` NullState `
115383
116384``` typescript
0 commit comments