Skip to content

Commit 9d8ed67

Browse files
authored
Merge pull request #3 from typescript-package/develop
v2.0.0
2 parents f3a4ed7 + 8721fa5 commit 9d8ed67

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+2238
-150
lines changed

README.md

Lines changed: 270 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
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
4760
import {
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);
111348
activeEnum.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

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@typescript-package/state",
3-
"version": "1.0.0",
3+
"version": "2.0.0",
44
"author": "wwwdev.io <[email protected]>",
55
"description": "State management for TypeScript.",
66
"license": "MIT",

0 commit comments

Comments
 (0)