stunk 0.1.0 → 0.3.0

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/core.js CHANGED
@@ -1,22 +1,23 @@
1
- // Chunk creation function
2
1
  export function createChunk(initialValue) {
3
- let value = initialValue; // The current value of the chunk
4
- const subscribers = new Set(); // Set of subscribers
5
- return {
6
- // Get the current value
7
- get() {
8
- return value;
9
- },
10
- // Set a new value and notify subscribers
11
- set(newValue) {
2
+ let value = initialValue;
3
+ const subscribers = [];
4
+ const get = () => value;
5
+ const set = (newValue) => {
6
+ if (newValue !== value) {
12
7
  value = newValue;
13
- subscribers.forEach((callback) => callback(value));
14
- },
15
- // Subscribe to changes
16
- subscribe(callback) {
17
- subscribers.add(callback);
18
- // Return an unsubscribe function
19
- return () => subscribers.delete(callback);
20
- },
8
+ subscribers.forEach((subscriber) => subscriber(value)); // Notify all subscribers
9
+ }
21
10
  };
11
+ const subscribe = (callback) => {
12
+ subscribers.push(callback);
13
+ callback(value); // Immediately notify on subscription
14
+ // Return unsubscribe function
15
+ return () => {
16
+ const index = subscribers.indexOf(callback);
17
+ if (index >= 0) {
18
+ subscribers.splice(index, 1);
19
+ }
20
+ };
21
+ };
22
+ return { get, set, subscribe };
22
23
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "stunk",
3
- "version": "0.1.0",
3
+ "version": "0.3.0",
4
4
  "description": "Stunk - A framework-agnostic state management library implementing the Atomic State technique, utilizing chunk-based units for efficient state management.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/types/index.d.ts",
package/src/core.ts CHANGED
@@ -1,30 +1,36 @@
1
- // Define the Chunk type
2
- export type Chunk<T> = {
3
- get: () => T; // Get the value of the chunk
4
- set: (newValue: T) => void; // Set the value of the chunk
5
- subscribe: (callback: (value: T) => void) => () => void; // Subscribe to changes
6
- };
1
+ export type Subscriber<T> = (newValue: T) => void;
2
+
3
+ export interface Chunk<T> {
4
+ get: () => T;
5
+ set: (value: T) => void;
6
+ subscribe: (callback: Subscriber<T>) => () => void;
7
+ }
7
8
 
8
- // Chunk creation function
9
9
  export function createChunk<T>(initialValue: T): Chunk<T> {
10
- let value = initialValue; // The current value of the chunk
11
- const subscribers = new Set<(value: T) => void>(); // Set of subscribers
10
+ let value = initialValue;
11
+ const subscribers: Subscriber<T>[] = [];
12
12
 
13
- return {
14
- // Get the current value
15
- get() {
16
- return value;
17
- },
18
- // Set a new value and notify subscribers
19
- set(newValue: T) {
13
+ const get = () => value;
14
+
15
+ const set = (newValue: T) => {
16
+ if (newValue !== value) {
20
17
  value = newValue;
21
- subscribers.forEach((callback) => callback(value));
22
- },
23
- // Subscribe to changes
24
- subscribe(callback: (value: T) => void) {
25
- subscribers.add(callback);
26
- // Return an unsubscribe function
27
- return () => subscribers.delete(callback);
28
- },
18
+ subscribers.forEach((subscriber) => subscriber(value)); // Notify all subscribers
19
+ }
29
20
  };
21
+
22
+ const subscribe = (callback: Subscriber<T>) => {
23
+ subscribers.push(callback);
24
+ callback(value); // Immediately notify on subscription
25
+
26
+ // Return unsubscribe function
27
+ return () => {
28
+ const index = subscribers.indexOf(callback);
29
+ if (index >= 0) {
30
+ subscribers.splice(index, 1);
31
+ }
32
+ };
33
+ };
34
+
35
+ return { get, set, subscribe };
30
36
  }
package/tsconfig.json CHANGED
@@ -6,10 +6,11 @@
6
6
  "outDir": "./dist",
7
7
  "declaration": true,
8
8
  "declarationDir": "./dist/types",
9
+ "typeRoots": ["./node_modules/@types", "./types"],
9
10
  "strict": true,
10
11
  "esModuleInterop": true,
11
12
  "skipLibCheck": true
12
13
  },
13
- "include": ["src/**/*"],
14
+ "include": ["src/**/*", "types/stunk.d.ts"],
14
15
  "exclude": ["node_modules", "dist"]
15
16
  }
@@ -0,0 +1,11 @@
1
+ declare module 'stunk' {
2
+ export type Subscriber<T> = (newValue: T) => void;
3
+
4
+ export interface Chunk<T> {
5
+ get: () => T;
6
+ set: (value: T) => void;
7
+ subscribe: (callback: Subscriber<T>) => () => void;
8
+ }
9
+
10
+ export function createChunk<T>(initialValue: T): Chunk<T>;
11
+ }