react-state-monad 1.0.8 → 1.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +169 -0
- package/dist/index.d.cts +132 -0
- package/dist/index.d.ts +132 -0
- package/dist/index.js +137 -0
- package/package.json +1 -3
package/dist/index.cjs
ADDED
@@ -0,0 +1,169 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __defProp = Object.defineProperty;
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
6
|
+
var __export = (target, all) => {
|
7
|
+
for (var name in all)
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
9
|
+
};
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
12
|
+
for (let key of __getOwnPropNames(from))
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
15
|
+
}
|
16
|
+
return to;
|
17
|
+
};
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
19
|
+
|
20
|
+
// index.ts
|
21
|
+
var index_exports = {};
|
22
|
+
__export(index_exports, {
|
23
|
+
default: () => index_default,
|
24
|
+
useArrayState: () => useArrayState,
|
25
|
+
useElementState: () => useElementState,
|
26
|
+
useEmptyState: () => useEmptyState,
|
27
|
+
useFieldState: () => useFieldState,
|
28
|
+
useRemapArray: () => useRemapArray,
|
29
|
+
useStateObject: () => useStateObject
|
30
|
+
});
|
31
|
+
module.exports = __toCommonJS(index_exports);
|
32
|
+
|
33
|
+
// src/hooks/useFieldState.ts
|
34
|
+
function useFieldState(state, field) {
|
35
|
+
return state.map(
|
36
|
+
(original) => original[field],
|
37
|
+
// Extracts the field value.
|
38
|
+
(newField, original) => ({ ...original, [field]: newField })
|
39
|
+
// Updates the field with the new value.
|
40
|
+
);
|
41
|
+
}
|
42
|
+
|
43
|
+
// src/implementations/emptyState.ts
|
44
|
+
var EmptyState = class _EmptyState {
|
45
|
+
// No value stored, returns an error when accessed.
|
46
|
+
get value() {
|
47
|
+
throw new Error("Not implemented");
|
48
|
+
}
|
49
|
+
get hasValue() {
|
50
|
+
return false;
|
51
|
+
}
|
52
|
+
orElse(orElse) {
|
53
|
+
return orElse;
|
54
|
+
}
|
55
|
+
do() {
|
56
|
+
}
|
57
|
+
filter() {
|
58
|
+
return this;
|
59
|
+
}
|
60
|
+
set value(_) {
|
61
|
+
}
|
62
|
+
flatMap() {
|
63
|
+
return new _EmptyState();
|
64
|
+
}
|
65
|
+
map() {
|
66
|
+
return new _EmptyState();
|
67
|
+
}
|
68
|
+
};
|
69
|
+
|
70
|
+
// src/implementations/validState.ts
|
71
|
+
var ValidState = class _ValidState {
|
72
|
+
state;
|
73
|
+
setter;
|
74
|
+
constructor(state, setter) {
|
75
|
+
this.state = state;
|
76
|
+
this.setter = setter;
|
77
|
+
}
|
78
|
+
get value() {
|
79
|
+
return this.state;
|
80
|
+
}
|
81
|
+
do(action) {
|
82
|
+
action(this.state);
|
83
|
+
}
|
84
|
+
orElse() {
|
85
|
+
return this.state;
|
86
|
+
}
|
87
|
+
set value(newState) {
|
88
|
+
this.setter(newState);
|
89
|
+
}
|
90
|
+
map(mappingFunction, inverseMappingFunction) {
|
91
|
+
const derivedState = mappingFunction(this.state);
|
92
|
+
const derivedSetter = (newState) => {
|
93
|
+
this.setter(inverseMappingFunction(newState, this.state));
|
94
|
+
};
|
95
|
+
return new _ValidState(derivedState, derivedSetter);
|
96
|
+
}
|
97
|
+
flatMap(mappingFunction) {
|
98
|
+
return mappingFunction(this.state);
|
99
|
+
}
|
100
|
+
get hasValue() {
|
101
|
+
return true;
|
102
|
+
}
|
103
|
+
filter(predicate) {
|
104
|
+
return predicate(this.state) ? this : new EmptyState();
|
105
|
+
}
|
106
|
+
};
|
107
|
+
|
108
|
+
// src/hooks/useElementState.ts
|
109
|
+
function useElementState(state, index) {
|
110
|
+
if (!state.hasValue || index < 0 || index >= state.value.length) {
|
111
|
+
return new EmptyState();
|
112
|
+
}
|
113
|
+
return new ValidState(
|
114
|
+
state.value[index],
|
115
|
+
(newElement) => {
|
116
|
+
const arrayCopy = [...state.value];
|
117
|
+
arrayCopy[index] = newElement;
|
118
|
+
state.value = arrayCopy;
|
119
|
+
}
|
120
|
+
);
|
121
|
+
}
|
122
|
+
|
123
|
+
// src/hooks/useEmptyState.ts
|
124
|
+
function useEmptyState() {
|
125
|
+
return new EmptyState();
|
126
|
+
}
|
127
|
+
|
128
|
+
// src/hooks/useStateObject.ts
|
129
|
+
var import_react = require("react");
|
130
|
+
function useStateObject(initialState) {
|
131
|
+
const [state, setState] = (0, import_react.useState)(initialState);
|
132
|
+
return new ValidState(state, setState);
|
133
|
+
}
|
134
|
+
|
135
|
+
// src/hooks/useRemapArray.ts
|
136
|
+
function useRemapArray(state) {
|
137
|
+
if (!state.hasValue) return [];
|
138
|
+
const count = state.value.length;
|
139
|
+
const result = [];
|
140
|
+
for (let i = 0; i < count; i++) {
|
141
|
+
result.push(
|
142
|
+
new ValidState(
|
143
|
+
state.value[i],
|
144
|
+
// The current value of the element at index i.
|
145
|
+
(newElement) => {
|
146
|
+
const arrayCopy = [...state.value];
|
147
|
+
arrayCopy[i] = newElement;
|
148
|
+
state.value = arrayCopy;
|
149
|
+
}
|
150
|
+
)
|
151
|
+
);
|
152
|
+
}
|
153
|
+
return result;
|
154
|
+
}
|
155
|
+
function useArrayState(states) {
|
156
|
+
return useStateObject(states.filter((state) => state.hasValue).map((state) => state.value));
|
157
|
+
}
|
158
|
+
|
159
|
+
// index.ts
|
160
|
+
var index_default = void 0;
|
161
|
+
// Annotate the CommonJS export names for ESM import in node:
|
162
|
+
0 && (module.exports = {
|
163
|
+
useArrayState,
|
164
|
+
useElementState,
|
165
|
+
useEmptyState,
|
166
|
+
useFieldState,
|
167
|
+
useRemapArray,
|
168
|
+
useStateObject
|
169
|
+
});
|
package/dist/index.d.cts
ADDED
@@ -0,0 +1,132 @@
|
|
1
|
+
/**
|
2
|
+
* Represents a state object that holds a value of type T, allowing various state operations.
|
3
|
+
* This is the main interface for managing state, with operations like `map`, `filter`, and `flatMap`.
|
4
|
+
* initialize with useStateObject<T>(initialState: T) hook
|
5
|
+
* @template T - The type of the value stored in the state object.
|
6
|
+
*/
|
7
|
+
type StateObject<T> = {
|
8
|
+
/**
|
9
|
+
* The current value of the state.
|
10
|
+
*/
|
11
|
+
get value(): T;
|
12
|
+
/**
|
13
|
+
* Returns true if the state has a valid value, false otherwise.
|
14
|
+
*/
|
15
|
+
get hasValue(): boolean;
|
16
|
+
/**
|
17
|
+
* Performs an action on the current state value.
|
18
|
+
*
|
19
|
+
* @param action - A function that accepts the current state value and performs some operation.
|
20
|
+
*/
|
21
|
+
do(action: (t: T) => void): void;
|
22
|
+
/**
|
23
|
+
* Sets a new value for the state.
|
24
|
+
*
|
25
|
+
* @param newState - The new state value to set.
|
26
|
+
*/
|
27
|
+
set value(newState: T);
|
28
|
+
/**
|
29
|
+
* Transforms the current state into another state object by applying a mapping function.
|
30
|
+
*
|
31
|
+
* @template U - The type of the new state value.
|
32
|
+
* @param mappingFunction - A function that transforms the current state value into a new value.
|
33
|
+
* @param inverseMappingFunction - A function that transforms a new value back to the original state type.
|
34
|
+
* @returns A new StateObject with the transformed value.
|
35
|
+
*/
|
36
|
+
map<U>(mappingFunction: (t: T) => U, inverseMappingFunction: (u: U, t: T) => T): StateObject<U>;
|
37
|
+
/**
|
38
|
+
* Filters the state based on a predicate, returning an empty state if the predicate is not satisfied.
|
39
|
+
*
|
40
|
+
* @param predicate - A function that tests the current state value.
|
41
|
+
* @returns A new StateObject with the original value or an empty state.
|
42
|
+
*/
|
43
|
+
filter(predicate: (t: T) => boolean): StateObject<T>;
|
44
|
+
/**
|
45
|
+
* Returns the current state value if it exists; otherwise, returns the provided alternative value.
|
46
|
+
*
|
47
|
+
* @param orElse - The value to return if the state does not have a valid value.
|
48
|
+
* @returns The current state value or the provided fallback value.
|
49
|
+
*/
|
50
|
+
orElse(orElse: T): T;
|
51
|
+
/**
|
52
|
+
* Transforms the current state into another state object by applying a mapping function that returns a new state.
|
53
|
+
*
|
54
|
+
* @template U - The type of the new state value.
|
55
|
+
* @param mappingFunction - A function that transforms the current state value into another state object.
|
56
|
+
* @returns A new StateObject based on the result of the mapping function.
|
57
|
+
*/
|
58
|
+
flatMap<U>(mappingFunction: (t: T) => StateObject<U>): StateObject<U>;
|
59
|
+
};
|
60
|
+
|
61
|
+
/**
|
62
|
+
* Helper type that ensures a field is a valid key of an object and that the field's type matches the expected type.
|
63
|
+
*
|
64
|
+
* @template TObject - The object type.
|
65
|
+
* @template TField - The expected type of the field.
|
66
|
+
*/
|
67
|
+
type ValidFieldFrom<TObject, TField> = {
|
68
|
+
[Key in keyof TObject]: TObject[Key] extends TField ? Key : never;
|
69
|
+
}[keyof TObject];
|
70
|
+
|
71
|
+
/**
|
72
|
+
* Hook that derives a field from the state object and creates a new StateObject for the field's value.
|
73
|
+
*
|
74
|
+
* @template TOriginal - The type of the original state object.
|
75
|
+
* @template TField - The type of the field value to be derived.
|
76
|
+
* @param state - The StateObject containing the original state.
|
77
|
+
* @param field - The field name to be derived from the state.
|
78
|
+
* @returns A new StateObject for the derived field.
|
79
|
+
*/
|
80
|
+
declare function useFieldState<TOriginal, TField>(state: StateObject<TOriginal>, field: ValidFieldFrom<TOriginal, TField>): StateObject<TField>;
|
81
|
+
|
82
|
+
/**
|
83
|
+
* Hook that allows you to derive and update a specific element in an array within a StateObject.
|
84
|
+
*
|
85
|
+
* @template T - The type of the array elements.
|
86
|
+
* @param state - The StateObject containing an array.
|
87
|
+
* @param index - The index of the element to be derived.
|
88
|
+
* @returns A new StateObject representing the element at the given index.
|
89
|
+
*/
|
90
|
+
declare function useElementState<T>(state: StateObject<T[]>, index: number): StateObject<T>;
|
91
|
+
|
92
|
+
/**
|
93
|
+
* Hook that initializes a StateObject with an empty state.
|
94
|
+
* This is useful as a fallback when no valid state is available.
|
95
|
+
*
|
96
|
+
* @template T - The type of the value that could be held by the state.
|
97
|
+
* @returns A StateObject representing an empty state.
|
98
|
+
*/
|
99
|
+
declare function useEmptyState<T>(): StateObject<T>;
|
100
|
+
|
101
|
+
/**
|
102
|
+
* Hook that maps each element in an array within a StateObject to a new StateObject,
|
103
|
+
* allowing for independent updates of each element while keeping the overall array state synchronized.
|
104
|
+
*
|
105
|
+
* @template T - The type of the array elements.
|
106
|
+
* @param state - The StateObject containing an array.
|
107
|
+
* @returns An array of new StateObjects, each representing an element in the original array,
|
108
|
+
* allowing individual updates while keeping the array state synchronized.
|
109
|
+
*/
|
110
|
+
declare function useRemapArray<T>(state: StateObject<T[]>): StateObject<T>[];
|
111
|
+
/**
|
112
|
+
* Hook that takes an array of StateObjects and returns a new StateObject containing that array,
|
113
|
+
* allowing for updates to the entire array while keeping it synchronized within a single StateObject.
|
114
|
+
*
|
115
|
+
* @template T - The type of the elements in the array.
|
116
|
+
* @param states - The array of StateObjects.
|
117
|
+
* @returns A new StateObject containing the array of StateObjects, allowing for updates to the whole array.
|
118
|
+
*/
|
119
|
+
declare function useArrayState<T>(states: StateObject<T>[]): StateObject<T[]>;
|
120
|
+
|
121
|
+
/**
|
122
|
+
* Hook that initializes a StateObject with the given initial value.
|
123
|
+
*
|
124
|
+
* @template T - The type of the value to be stored in the state.
|
125
|
+
* @param initialState - The initial value of the state.
|
126
|
+
* @returns A StateObject representing the initialized state.
|
127
|
+
*/
|
128
|
+
declare function useStateObject<T>(initialState: T): StateObject<T>;
|
129
|
+
|
130
|
+
declare const _default: undefined;
|
131
|
+
|
132
|
+
export { type StateObject, _default as default, useArrayState, useElementState, useEmptyState, useFieldState, useRemapArray, useStateObject };
|
package/dist/index.d.ts
ADDED
@@ -0,0 +1,132 @@
|
|
1
|
+
/**
|
2
|
+
* Represents a state object that holds a value of type T, allowing various state operations.
|
3
|
+
* This is the main interface for managing state, with operations like `map`, `filter`, and `flatMap`.
|
4
|
+
* initialize with useStateObject<T>(initialState: T) hook
|
5
|
+
* @template T - The type of the value stored in the state object.
|
6
|
+
*/
|
7
|
+
type StateObject<T> = {
|
8
|
+
/**
|
9
|
+
* The current value of the state.
|
10
|
+
*/
|
11
|
+
get value(): T;
|
12
|
+
/**
|
13
|
+
* Returns true if the state has a valid value, false otherwise.
|
14
|
+
*/
|
15
|
+
get hasValue(): boolean;
|
16
|
+
/**
|
17
|
+
* Performs an action on the current state value.
|
18
|
+
*
|
19
|
+
* @param action - A function that accepts the current state value and performs some operation.
|
20
|
+
*/
|
21
|
+
do(action: (t: T) => void): void;
|
22
|
+
/**
|
23
|
+
* Sets a new value for the state.
|
24
|
+
*
|
25
|
+
* @param newState - The new state value to set.
|
26
|
+
*/
|
27
|
+
set value(newState: T);
|
28
|
+
/**
|
29
|
+
* Transforms the current state into another state object by applying a mapping function.
|
30
|
+
*
|
31
|
+
* @template U - The type of the new state value.
|
32
|
+
* @param mappingFunction - A function that transforms the current state value into a new value.
|
33
|
+
* @param inverseMappingFunction - A function that transforms a new value back to the original state type.
|
34
|
+
* @returns A new StateObject with the transformed value.
|
35
|
+
*/
|
36
|
+
map<U>(mappingFunction: (t: T) => U, inverseMappingFunction: (u: U, t: T) => T): StateObject<U>;
|
37
|
+
/**
|
38
|
+
* Filters the state based on a predicate, returning an empty state if the predicate is not satisfied.
|
39
|
+
*
|
40
|
+
* @param predicate - A function that tests the current state value.
|
41
|
+
* @returns A new StateObject with the original value or an empty state.
|
42
|
+
*/
|
43
|
+
filter(predicate: (t: T) => boolean): StateObject<T>;
|
44
|
+
/**
|
45
|
+
* Returns the current state value if it exists; otherwise, returns the provided alternative value.
|
46
|
+
*
|
47
|
+
* @param orElse - The value to return if the state does not have a valid value.
|
48
|
+
* @returns The current state value or the provided fallback value.
|
49
|
+
*/
|
50
|
+
orElse(orElse: T): T;
|
51
|
+
/**
|
52
|
+
* Transforms the current state into another state object by applying a mapping function that returns a new state.
|
53
|
+
*
|
54
|
+
* @template U - The type of the new state value.
|
55
|
+
* @param mappingFunction - A function that transforms the current state value into another state object.
|
56
|
+
* @returns A new StateObject based on the result of the mapping function.
|
57
|
+
*/
|
58
|
+
flatMap<U>(mappingFunction: (t: T) => StateObject<U>): StateObject<U>;
|
59
|
+
};
|
60
|
+
|
61
|
+
/**
|
62
|
+
* Helper type that ensures a field is a valid key of an object and that the field's type matches the expected type.
|
63
|
+
*
|
64
|
+
* @template TObject - The object type.
|
65
|
+
* @template TField - The expected type of the field.
|
66
|
+
*/
|
67
|
+
type ValidFieldFrom<TObject, TField> = {
|
68
|
+
[Key in keyof TObject]: TObject[Key] extends TField ? Key : never;
|
69
|
+
}[keyof TObject];
|
70
|
+
|
71
|
+
/**
|
72
|
+
* Hook that derives a field from the state object and creates a new StateObject for the field's value.
|
73
|
+
*
|
74
|
+
* @template TOriginal - The type of the original state object.
|
75
|
+
* @template TField - The type of the field value to be derived.
|
76
|
+
* @param state - The StateObject containing the original state.
|
77
|
+
* @param field - The field name to be derived from the state.
|
78
|
+
* @returns A new StateObject for the derived field.
|
79
|
+
*/
|
80
|
+
declare function useFieldState<TOriginal, TField>(state: StateObject<TOriginal>, field: ValidFieldFrom<TOriginal, TField>): StateObject<TField>;
|
81
|
+
|
82
|
+
/**
|
83
|
+
* Hook that allows you to derive and update a specific element in an array within a StateObject.
|
84
|
+
*
|
85
|
+
* @template T - The type of the array elements.
|
86
|
+
* @param state - The StateObject containing an array.
|
87
|
+
* @param index - The index of the element to be derived.
|
88
|
+
* @returns A new StateObject representing the element at the given index.
|
89
|
+
*/
|
90
|
+
declare function useElementState<T>(state: StateObject<T[]>, index: number): StateObject<T>;
|
91
|
+
|
92
|
+
/**
|
93
|
+
* Hook that initializes a StateObject with an empty state.
|
94
|
+
* This is useful as a fallback when no valid state is available.
|
95
|
+
*
|
96
|
+
* @template T - The type of the value that could be held by the state.
|
97
|
+
* @returns A StateObject representing an empty state.
|
98
|
+
*/
|
99
|
+
declare function useEmptyState<T>(): StateObject<T>;
|
100
|
+
|
101
|
+
/**
|
102
|
+
* Hook that maps each element in an array within a StateObject to a new StateObject,
|
103
|
+
* allowing for independent updates of each element while keeping the overall array state synchronized.
|
104
|
+
*
|
105
|
+
* @template T - The type of the array elements.
|
106
|
+
* @param state - The StateObject containing an array.
|
107
|
+
* @returns An array of new StateObjects, each representing an element in the original array,
|
108
|
+
* allowing individual updates while keeping the array state synchronized.
|
109
|
+
*/
|
110
|
+
declare function useRemapArray<T>(state: StateObject<T[]>): StateObject<T>[];
|
111
|
+
/**
|
112
|
+
* Hook that takes an array of StateObjects and returns a new StateObject containing that array,
|
113
|
+
* allowing for updates to the entire array while keeping it synchronized within a single StateObject.
|
114
|
+
*
|
115
|
+
* @template T - The type of the elements in the array.
|
116
|
+
* @param states - The array of StateObjects.
|
117
|
+
* @returns A new StateObject containing the array of StateObjects, allowing for updates to the whole array.
|
118
|
+
*/
|
119
|
+
declare function useArrayState<T>(states: StateObject<T>[]): StateObject<T[]>;
|
120
|
+
|
121
|
+
/**
|
122
|
+
* Hook that initializes a StateObject with the given initial value.
|
123
|
+
*
|
124
|
+
* @template T - The type of the value to be stored in the state.
|
125
|
+
* @param initialState - The initial value of the state.
|
126
|
+
* @returns A StateObject representing the initialized state.
|
127
|
+
*/
|
128
|
+
declare function useStateObject<T>(initialState: T): StateObject<T>;
|
129
|
+
|
130
|
+
declare const _default: undefined;
|
131
|
+
|
132
|
+
export { type StateObject, _default as default, useArrayState, useElementState, useEmptyState, useFieldState, useRemapArray, useStateObject };
|
package/dist/index.js
ADDED
@@ -0,0 +1,137 @@
|
|
1
|
+
// src/hooks/useFieldState.ts
|
2
|
+
function useFieldState(state, field) {
|
3
|
+
return state.map(
|
4
|
+
(original) => original[field],
|
5
|
+
// Extracts the field value.
|
6
|
+
(newField, original) => ({ ...original, [field]: newField })
|
7
|
+
// Updates the field with the new value.
|
8
|
+
);
|
9
|
+
}
|
10
|
+
|
11
|
+
// src/implementations/emptyState.ts
|
12
|
+
var EmptyState = class _EmptyState {
|
13
|
+
// No value stored, returns an error when accessed.
|
14
|
+
get value() {
|
15
|
+
throw new Error("Not implemented");
|
16
|
+
}
|
17
|
+
get hasValue() {
|
18
|
+
return false;
|
19
|
+
}
|
20
|
+
orElse(orElse) {
|
21
|
+
return orElse;
|
22
|
+
}
|
23
|
+
do() {
|
24
|
+
}
|
25
|
+
filter() {
|
26
|
+
return this;
|
27
|
+
}
|
28
|
+
set value(_) {
|
29
|
+
}
|
30
|
+
flatMap() {
|
31
|
+
return new _EmptyState();
|
32
|
+
}
|
33
|
+
map() {
|
34
|
+
return new _EmptyState();
|
35
|
+
}
|
36
|
+
};
|
37
|
+
|
38
|
+
// src/implementations/validState.ts
|
39
|
+
var ValidState = class _ValidState {
|
40
|
+
state;
|
41
|
+
setter;
|
42
|
+
constructor(state, setter) {
|
43
|
+
this.state = state;
|
44
|
+
this.setter = setter;
|
45
|
+
}
|
46
|
+
get value() {
|
47
|
+
return this.state;
|
48
|
+
}
|
49
|
+
do(action) {
|
50
|
+
action(this.state);
|
51
|
+
}
|
52
|
+
orElse() {
|
53
|
+
return this.state;
|
54
|
+
}
|
55
|
+
set value(newState) {
|
56
|
+
this.setter(newState);
|
57
|
+
}
|
58
|
+
map(mappingFunction, inverseMappingFunction) {
|
59
|
+
const derivedState = mappingFunction(this.state);
|
60
|
+
const derivedSetter = (newState) => {
|
61
|
+
this.setter(inverseMappingFunction(newState, this.state));
|
62
|
+
};
|
63
|
+
return new _ValidState(derivedState, derivedSetter);
|
64
|
+
}
|
65
|
+
flatMap(mappingFunction) {
|
66
|
+
return mappingFunction(this.state);
|
67
|
+
}
|
68
|
+
get hasValue() {
|
69
|
+
return true;
|
70
|
+
}
|
71
|
+
filter(predicate) {
|
72
|
+
return predicate(this.state) ? this : new EmptyState();
|
73
|
+
}
|
74
|
+
};
|
75
|
+
|
76
|
+
// src/hooks/useElementState.ts
|
77
|
+
function useElementState(state, index) {
|
78
|
+
if (!state.hasValue || index < 0 || index >= state.value.length) {
|
79
|
+
return new EmptyState();
|
80
|
+
}
|
81
|
+
return new ValidState(
|
82
|
+
state.value[index],
|
83
|
+
(newElement) => {
|
84
|
+
const arrayCopy = [...state.value];
|
85
|
+
arrayCopy[index] = newElement;
|
86
|
+
state.value = arrayCopy;
|
87
|
+
}
|
88
|
+
);
|
89
|
+
}
|
90
|
+
|
91
|
+
// src/hooks/useEmptyState.ts
|
92
|
+
function useEmptyState() {
|
93
|
+
return new EmptyState();
|
94
|
+
}
|
95
|
+
|
96
|
+
// src/hooks/useStateObject.ts
|
97
|
+
import { useState } from "react";
|
98
|
+
function useStateObject(initialState) {
|
99
|
+
const [state, setState] = useState(initialState);
|
100
|
+
return new ValidState(state, setState);
|
101
|
+
}
|
102
|
+
|
103
|
+
// src/hooks/useRemapArray.ts
|
104
|
+
function useRemapArray(state) {
|
105
|
+
if (!state.hasValue) return [];
|
106
|
+
const count = state.value.length;
|
107
|
+
const result = [];
|
108
|
+
for (let i = 0; i < count; i++) {
|
109
|
+
result.push(
|
110
|
+
new ValidState(
|
111
|
+
state.value[i],
|
112
|
+
// The current value of the element at index i.
|
113
|
+
(newElement) => {
|
114
|
+
const arrayCopy = [...state.value];
|
115
|
+
arrayCopy[i] = newElement;
|
116
|
+
state.value = arrayCopy;
|
117
|
+
}
|
118
|
+
)
|
119
|
+
);
|
120
|
+
}
|
121
|
+
return result;
|
122
|
+
}
|
123
|
+
function useArrayState(states) {
|
124
|
+
return useStateObject(states.filter((state) => state.hasValue).map((state) => state.value));
|
125
|
+
}
|
126
|
+
|
127
|
+
// index.ts
|
128
|
+
var index_default = void 0;
|
129
|
+
export {
|
130
|
+
index_default as default,
|
131
|
+
useArrayState,
|
132
|
+
useElementState,
|
133
|
+
useEmptyState,
|
134
|
+
useFieldState,
|
135
|
+
useRemapArray,
|
136
|
+
useStateObject
|
137
|
+
};
|
package/package.json
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
{
|
2
2
|
"name": "react-state-monad",
|
3
3
|
"type": "module",
|
4
|
-
"version": "1.0.
|
4
|
+
"version": "1.0.9",
|
5
5
|
"description": "A set of hooks to manage/transform/filter states with monads in React",
|
6
6
|
"keywords": [
|
7
7
|
"maybe",
|
@@ -35,6 +35,4 @@
|
|
35
35
|
"module": "dist/index.mjs",
|
36
36
|
"types": "dist/types/index.d.ts"
|
37
37
|
|
38
|
-
|
39
|
-
|
40
38
|
}
|