dirvi-lib 0.11.0-beta.5 → 0.11.0-beta.7
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/app/app-api.d.ts +7 -25
- package/dist/app/app-api.d.ts.map +1 -1
- package/dist/app/app-api.js +1 -11
- package/dist/app/index.d.ts +1 -0
- package/dist/app/index.d.ts.map +1 -1
- package/dist/app/index.js +1 -0
- package/dist/app/node-presentation.d.ts +13 -0
- package/dist/app/node-presentation.d.ts.map +1 -0
- package/dist/app/reducer/effect-to-action.d.ts +2 -2
- package/dist/app/reducer/effect-to-action.d.ts.map +1 -1
- package/dist/app/reducer/effect-to-action.js +87 -32
- package/dist/app/reducer/reducer-action.d.ts +12 -6
- package/dist/app/reducer/reducer-action.d.ts.map +1 -1
- package/dist/app/reducer/reducer.d.ts +4 -2
- package/dist/app/reducer/reducer.d.ts.map +1 -1
- package/dist/app/reducer/reducer.js +102 -68
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/input/application/intent-to-effect.d.ts +2 -2
- package/dist/input/application/intent-to-effect.d.ts.map +1 -1
- package/dist/input/application/intent-to-effect.js +9 -10
- package/dist/input/application/parse-ex-command.d.ts +22 -12
- package/dist/input/application/parse-ex-command.d.ts.map +1 -1
- package/dist/input/application/parse-ex-command.js +61 -65
- package/dist/input/application/parse-normal-command.d.ts +1 -1
- package/dist/input/application/parse-normal-command.d.ts.map +1 -1
- package/dist/input/domain/effect.d.ts +9 -5
- package/dist/input/domain/effect.d.ts.map +1 -1
- package/dist/state-and-nav/cursor.d.ts +89 -0
- package/dist/state-and-nav/cursor.d.ts.map +1 -0
- package/dist/state-and-nav/cursor.js +84 -0
- package/dist/{trees → state-and-nav}/fold-node/deprecated/fold-node.impl.d.ts +1 -1
- package/dist/state-and-nav/fold-node/deprecated/fold-node.impl.d.ts.map +1 -0
- package/dist/state-and-nav/fold-node/deprecated/fold-node.test.d.ts.map +1 -0
- package/dist/{trees → state-and-nav}/fold-node/deprecated/fold-node.test.js +2 -2
- package/dist/{trees → state-and-nav}/fold-node/deprecated/fold-node.types.d.ts +2 -2
- package/dist/state-and-nav/fold-node/deprecated/fold-node.types.d.ts.map +1 -0
- package/dist/{trees → state-and-nav}/fold-node/fold-node.impl.d.ts +3 -3
- package/dist/state-and-nav/fold-node/fold-node.impl.d.ts.map +1 -0
- package/dist/{trees → state-and-nav}/fold-node/fold-node.impl.js +1 -1
- package/dist/{trees → state-and-nav}/fold-node/fold-node.model.d.ts +1 -1
- package/dist/state-and-nav/fold-node/fold-node.model.d.ts.map +1 -0
- package/dist/{trees → state-and-nav}/fold-node/fold-node.types.d.ts +2 -2
- package/dist/state-and-nav/fold-node/fold-node.types.d.ts.map +1 -0
- package/dist/state-and-nav/fold-node/index.d.ts.map +1 -0
- package/dist/state-and-nav/index.d.ts +16 -0
- package/dist/state-and-nav/index.d.ts.map +1 -0
- package/dist/state-and-nav/index.js +6 -0
- package/dist/state-and-nav/nav/nav.ordered.impl.d.ts +12 -0
- package/dist/state-and-nav/nav/nav.ordered.impl.d.ts.map +1 -0
- package/dist/state-and-nav/nav/nav.ordered.impl.js +77 -0
- package/dist/state-and-nav/nav/nav.traversal.d.ts +11 -0
- package/dist/state-and-nav/nav/nav.traversal.d.ts.map +1 -0
- package/dist/state-and-nav/nav/nav.traversal.js +207 -0
- package/dist/{trees/nav-node/nav-node.types.d.ts → state-and-nav/nav/nav.types.d.ts} +32 -22
- package/dist/state-and-nav/nav/nav.types.d.ts.map +1 -0
- package/dist/state-and-nav/nav/nav.unordered.impl.d.ts +13 -0
- package/dist/state-and-nav/nav/nav.unordered.impl.d.ts.map +1 -0
- package/dist/state-and-nav/nav/nav.unordered.impl.js +77 -0
- package/dist/state-and-nav/state/state.impl.d.ts +9 -0
- package/dist/state-and-nav/state/state.impl.d.ts.map +1 -0
- package/dist/{trees → state-and-nav}/state/state.impl.js +62 -9
- package/dist/state-and-nav/state/state.schemas.d.ts +2 -0
- package/dist/state-and-nav/state/state.schemas.d.ts.map +1 -0
- package/dist/state-and-nav/state/state.schemas.js +39 -0
- package/dist/state-and-nav/state/state.types.d.ts +72 -0
- package/dist/state-and-nav/state/state.types.d.ts.map +1 -0
- package/dist/state-and-nav/tree/deprecated/tree-node.arb.d.ts.map +1 -0
- package/dist/state-and-nav/tree/deprecated/tree-node.arb.debug.test.d.ts.map +1 -0
- package/dist/state-and-nav/tree/deprecated/tree-node.impl.d.ts.map +1 -0
- package/dist/state-and-nav/tree/deprecated/tree-node.schemas.d.ts.map +1 -0
- package/dist/state-and-nav/tree/deprecated/tree-node.test.d.ts.map +1 -0
- package/dist/state-and-nav/tree/deprecated/tree-node.types.d.ts.map +1 -0
- package/dist/state-and-nav/tree/index.d.ts +7 -0
- package/dist/state-and-nav/tree/index.d.ts.map +1 -0
- package/dist/state-and-nav/tree/index.js +1 -0
- package/dist/state-and-nav/tree/tree-node.arb.d.ts +94 -0
- package/dist/state-and-nav/tree/tree-node.arb.d.ts.map +1 -0
- package/dist/state-and-nav/tree/tree-node.arb.debug.test.d.ts +2 -0
- package/dist/state-and-nav/tree/tree-node.arb.debug.test.d.ts.map +1 -0
- package/dist/state-and-nav/tree/tree-node.arb.debug.test.js +54 -0
- package/dist/state-and-nav/tree/tree-node.arb.js +188 -0
- package/dist/state-and-nav/tree/tree-node.model.d.ts +193 -0
- package/dist/state-and-nav/tree/tree-node.model.d.ts.map +1 -0
- package/dist/state-and-nav/tree/tree-node.model.js +110 -0
- package/dist/state-and-nav/tree/tree-node.test.d.ts +2 -0
- package/dist/state-and-nav/tree/tree-node.test.d.ts.map +1 -0
- package/dist/state-and-nav/tree/tree-node.test.js +234 -0
- package/dist/{trees/tree-node/tree-node.impl.d.ts → state-and-nav/tree/tree.impl.d.ts} +3 -3
- package/dist/state-and-nav/tree/tree.impl.d.ts.map +1 -0
- package/dist/{trees/tree-node/tree-node.impl.js → state-and-nav/tree/tree.impl.js} +19 -16
- package/dist/{trees/tree-node/tree-node.types.d.ts → state-and-nav/tree/tree.types.d.ts} +64 -44
- package/dist/state-and-nav/tree/tree.types.d.ts.map +1 -0
- package/dist/state-and-nav/tree/tree.types.js +1 -0
- package/package.json +1 -1
- package/dist/trees/cursor.d.ts +0 -59
- package/dist/trees/cursor.d.ts.map +0 -1
- package/dist/trees/cursor.js +0 -55
- package/dist/trees/fold-node/deprecated/fold-node.impl.d.ts.map +0 -1
- package/dist/trees/fold-node/deprecated/fold-node.test.d.ts.map +0 -1
- package/dist/trees/fold-node/deprecated/fold-node.types.d.ts.map +0 -1
- package/dist/trees/fold-node/fold-node.impl.d.ts.map +0 -1
- package/dist/trees/fold-node/fold-node.model.d.ts.map +0 -1
- package/dist/trees/fold-node/fold-node.types.d.ts.map +0 -1
- package/dist/trees/fold-node/index.d.ts.map +0 -1
- package/dist/trees/index.d.ts +0 -9
- package/dist/trees/index.d.ts.map +0 -1
- package/dist/trees/index.js +0 -8
- package/dist/trees/nav-node/nav-node.impl.d.ts +0 -29
- package/dist/trees/nav-node/nav-node.impl.d.ts.map +0 -1
- package/dist/trees/nav-node/nav-node.impl.js +0 -223
- package/dist/trees/nav-node/nav-node.types.d.ts.map +0 -1
- package/dist/trees/state/state.impl.d.ts +0 -8
- package/dist/trees/state/state.impl.d.ts.map +0 -1
- package/dist/trees/state/state.schemas.d.ts +0 -25
- package/dist/trees/state/state.schemas.d.ts.map +0 -1
- package/dist/trees/state/state.schemas.js +0 -17
- package/dist/trees/state/state.types.d.ts +0 -36
- package/dist/trees/state/state.types.d.ts.map +0 -1
- package/dist/trees/tree-node/deprecated/tree-node.arb.d.ts.map +0 -1
- package/dist/trees/tree-node/deprecated/tree-node.arb.debug.test.d.ts.map +0 -1
- package/dist/trees/tree-node/deprecated/tree-node.impl.d.ts.map +0 -1
- package/dist/trees/tree-node/deprecated/tree-node.schemas.d.ts.map +0 -1
- package/dist/trees/tree-node/deprecated/tree-node.test.d.ts.map +0 -1
- package/dist/trees/tree-node/deprecated/tree-node.types.d.ts.map +0 -1
- package/dist/trees/tree-node/index.d.ts +0 -5
- package/dist/trees/tree-node/index.d.ts.map +0 -1
- package/dist/trees/tree-node/index.js +0 -2
- package/dist/trees/tree-node/tree-node.arb.d.ts +0 -104
- package/dist/trees/tree-node/tree-node.arb.d.ts.map +0 -1
- package/dist/trees/tree-node/tree-node.arb.js +0 -188
- package/dist/trees/tree-node/tree-node.impl.d.ts.map +0 -1
- package/dist/trees/tree-node/tree-node.model.d.ts +0 -78
- package/dist/trees/tree-node/tree-node.model.d.ts.map +0 -1
- package/dist/trees/tree-node/tree-node.model.js +0 -37
- package/dist/trees/tree-node/tree-node.types.d.ts.map +0 -1
- /package/dist/{trees/fold-node/deprecated/fold-node.types.js → app/node-presentation.js} +0 -0
- /package/dist/{trees → state-and-nav}/fold-node/deprecated/fold-node.impl.js +0 -0
- /package/dist/{trees → state-and-nav}/fold-node/deprecated/fold-node.test.d.ts +0 -0
- /package/dist/{trees/fold-node → state-and-nav/fold-node/deprecated}/fold-node.types.js +0 -0
- /package/dist/{trees → state-and-nav}/fold-node/fold-node.model.js +0 -0
- /package/dist/{trees/nav-node/nav-node.types.js → state-and-nav/fold-node/fold-node.types.js} +0 -0
- /package/dist/{trees → state-and-nav}/fold-node/index.d.ts +0 -0
- /package/dist/{trees → state-and-nav}/fold-node/index.js +0 -0
- /package/dist/{trees/state/state.types.js → state-and-nav/nav/nav.types.js} +0 -0
- /package/dist/{trees/tree-node/deprecated/tree-node.types.js → state-and-nav/state/state.types.js} +0 -0
- /package/dist/{trees/tree-node → state-and-nav/tree}/deprecated/tree-node.arb.d.ts +0 -0
- /package/dist/{trees/tree-node → state-and-nav/tree}/deprecated/tree-node.arb.debug.test.d.ts +0 -0
- /package/dist/{trees/tree-node → state-and-nav/tree}/deprecated/tree-node.arb.debug.test.js +0 -0
- /package/dist/{trees/tree-node → state-and-nav/tree}/deprecated/tree-node.arb.js +0 -0
- /package/dist/{trees/tree-node → state-and-nav/tree}/deprecated/tree-node.impl.d.ts +0 -0
- /package/dist/{trees/tree-node → state-and-nav/tree}/deprecated/tree-node.impl.js +0 -0
- /package/dist/{trees/tree-node → state-and-nav/tree}/deprecated/tree-node.schemas.d.ts +0 -0
- /package/dist/{trees/tree-node → state-and-nav/tree}/deprecated/tree-node.schemas.js +0 -0
- /package/dist/{trees/tree-node → state-and-nav/tree}/deprecated/tree-node.test.d.ts +0 -0
- /package/dist/{trees/tree-node → state-and-nav/tree}/deprecated/tree-node.test.js +0 -0
- /package/dist/{trees/tree-node → state-and-nav/tree}/deprecated/tree-node.types.d.ts +0 -0
- /package/dist/{trees/tree-node → state-and-nav/tree/deprecated}/tree-node.types.js +0 -0
package/dist/app/app-api.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { NavMethods, SerializableKey, StateApi } from '../state-and-nav/index.js';
|
|
2
|
+
import type { PresentNode } from './node-presentation.js';
|
|
3
|
+
import { TreeNode } from '../state-and-nav/index.js';
|
|
2
4
|
/**
|
|
3
5
|
* Application-specific tree dependencies and operations.
|
|
4
6
|
*
|
|
@@ -15,24 +17,21 @@ export type AppApi<Id extends SerializableKey, Value, ViewKey = string> = Readon
|
|
|
15
17
|
* Name used to distinguish a particular application instance.
|
|
16
18
|
*/
|
|
17
19
|
name: string;
|
|
18
|
-
/**
|
|
19
|
-
* ID used for the application's root node.
|
|
20
|
-
*/
|
|
21
|
-
rootId: Id;
|
|
22
20
|
/**
|
|
23
21
|
* Loads direct children for the branch addressed by `path`.
|
|
24
22
|
*
|
|
25
23
|
* Returned nodes must be opaque tree values created or decoded through this
|
|
26
24
|
* application's TreeNodeApi specialization.
|
|
27
25
|
*/
|
|
28
|
-
|
|
26
|
+
loadChildren: (path: readonly Id[]) => Promise<readonly TreeNode<Id, Value>[]>;
|
|
29
27
|
/**
|
|
30
28
|
* Creates the application's root node.
|
|
31
29
|
*
|
|
32
30
|
* Invariant: the returned node is an open branch. That invariant is checked
|
|
33
31
|
* when an initial State is created.
|
|
34
32
|
*/
|
|
35
|
-
|
|
33
|
+
loadRoot: () => Promise<TreeNode<Id, Value>>;
|
|
34
|
+
presentNode: PresentNode<Id>;
|
|
36
35
|
/**
|
|
37
36
|
* Subscribes to external data changes that require tree state to be loaded
|
|
38
37
|
* again.
|
|
@@ -40,27 +39,10 @@ export type AppApi<Id extends SerializableKey, Value, ViewKey = string> = Readon
|
|
|
40
39
|
* Returns an unsubscribe function.
|
|
41
40
|
*/
|
|
42
41
|
subscribeToResync: (listener: () => void) => () => void;
|
|
43
|
-
/**
|
|
44
|
-
* Generic structural operations for this application's buffer tree.
|
|
45
|
-
*/
|
|
46
|
-
treeNodeApi: TreeNodeApi<Id, Value>;
|
|
47
|
-
/**
|
|
48
|
-
* Semantic fold-state operations.
|
|
49
|
-
*
|
|
50
|
-
* This remains temporarily available while FoldNode itself is migrated.
|
|
51
|
-
*/
|
|
52
|
-
foldsApi: FoldsApi<Id>;
|
|
53
|
-
cursorApi: CursorApi<Id>;
|
|
54
42
|
stateApi: StateApi<Id, Value>;
|
|
55
43
|
/**
|
|
56
44
|
* UI navigation projection and cursor-navigation operations.
|
|
57
45
|
*/
|
|
58
|
-
|
|
59
|
-
}>;
|
|
60
|
-
export type AppStateApis<Id extends SerializableKey, Value> = Readonly<{
|
|
61
|
-
treeNodeApi: TreeNodeApi<Id, Value>;
|
|
62
|
-
cursorApi: CursorApi<Id>;
|
|
63
|
-
stateApi: StateApi<Id, Value>;
|
|
46
|
+
navMethods: NavMethods<Id, Value>;
|
|
64
47
|
}>;
|
|
65
|
-
export declare function createAppStateApis<Id extends SerializableKey, Value>(): AppStateApis<Id, Value>;
|
|
66
48
|
//# sourceMappingURL=app-api.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-api.d.ts","sourceRoot":"","sources":["../../src/app/app-api.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"app-api.d.ts","sourceRoot":"","sources":["../../src/app/app-api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EACV,eAAe,EACf,QAAQ,EACT,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAErD;;;;;;;;;;GAUG;AACH,MAAM,MAAM,MAAM,CAChB,EAAE,SAAS,eAAe,EAC1B,KAAK,EACL,OAAO,GAAG,MAAM,IACd,QAAQ,CAAC;IACX;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;;;;OAKG;IACH,YAAY,EAAE,CACZ,IAAI,EAAE,SAAS,EAAE,EAAE,KAChB,OAAO,CAAC,SAAS,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;IAE7C;;;;;OAKG;IACH,QAAQ,EAAE,MAAM,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;IAE7C,WAAW,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC;IAE7B;;;;;OAKG;IACH,iBAAiB,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAC;IAExD,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IAE9B;;OAEG;IACH,UAAU,EAAE,UAAU,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;CACnC,CAAC,CAAC"}
|
package/dist/app/app-api.js
CHANGED
|
@@ -1,11 +1 @@
|
|
|
1
|
-
|
|
2
|
-
export function createAppStateApis() {
|
|
3
|
-
const treeNodeApi = createTreeNodeApi();
|
|
4
|
-
const cursorApi = createCursorApi();
|
|
5
|
-
const stateApi = createStateApi(treeNodeApi, cursorApi);
|
|
6
|
-
return {
|
|
7
|
-
treeNodeApi,
|
|
8
|
-
cursorApi,
|
|
9
|
-
stateApi,
|
|
10
|
-
};
|
|
11
|
-
}
|
|
1
|
+
export {};
|
package/dist/app/index.d.ts
CHANGED
package/dist/app/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/app/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sBAAsB,CAAC;AACrC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/app/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,wBAAwB,CAAC;AACvC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sBAAsB,CAAC;AACrC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,eAAe,CAAC"}
|
package/dist/app/index.js
CHANGED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { SerializableKey } from '../state-and-nav/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* A semantic highlight name, not a concrete terminal color.
|
|
4
|
+
*
|
|
5
|
+
* Dot-separated names allow fallback to broader categories:
|
|
6
|
+
* "filesystem.directory" can fall back to "filesystem".
|
|
7
|
+
*/
|
|
8
|
+
export type HighlightToken = string;
|
|
9
|
+
export type PresentNode<Id extends SerializableKey> = (id: Id, isBranch: boolean) => Readonly<{
|
|
10
|
+
content: string;
|
|
11
|
+
highlight: HighlightToken;
|
|
12
|
+
}>;
|
|
13
|
+
//# sourceMappingURL=node-presentation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-presentation.d.ts","sourceRoot":"","sources":["../../src/app/node-presentation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAEjE;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC;AAEpC,MAAM,MAAM,WAAW,CAAC,EAAE,SAAS,eAAe,IAAI,CACpD,EAAE,EAAE,EAAE,EACN,QAAQ,EAAE,OAAO,KACd,QAAQ,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,cAAc,CAAC;CAC3B,CAAC,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { NavBranch, NavMethods, SerializableKey, State, StateApi } from '../../state-and-nav/index.js';
|
|
2
2
|
import type { EffectAction } from '../../input/domain/index.js';
|
|
3
3
|
import type { ReducerAction } from './reducer-action.js';
|
|
4
4
|
export type EffectToActionResult<Id extends SerializableKey, Value> = Readonly<{
|
|
@@ -11,5 +11,5 @@ export type EffectToActionResult<Id extends SerializableKey, Value> = Readonly<{
|
|
|
11
11
|
kind: 'ignored';
|
|
12
12
|
}>;
|
|
13
13
|
export type EffectToAction<Id extends SerializableKey, Value> = (effectAction: EffectAction<Id, Value>, navigation: NavBranch<Id>, state: State<Id, Value>) => EffectToActionResult<Id, Value>;
|
|
14
|
-
export declare function createEffectToAction<Id extends SerializableKey, Value>(
|
|
14
|
+
export declare function createEffectToAction<Id extends SerializableKey, Value>(stateApi: StateApi<Id, Value>, navNodeApi: NavMethods<Id, Value>): EffectToAction<Id, Value>;
|
|
15
15
|
//# sourceMappingURL=effect-to-action.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"effect-to-action.d.ts","sourceRoot":"","sources":["../../../src/app/reducer/effect-to-action.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"effect-to-action.d.ts","sourceRoot":"","sources":["../../../src/app/reducer/effect-to-action.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,SAAS,EACT,UAAU,EACV,eAAe,EACf,KAAK,EACL,QAAQ,EACT,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EACV,YAAY,EAEb,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,MAAM,MAAM,oBAAoB,CAAC,EAAE,SAAS,eAAe,EAAE,KAAK,IAC9D,QAAQ,CAAC;IACP,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,EAAE,aAAa,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;CAClC,CAAC,GACF,QAAQ,CAAC;IACP,IAAI,EAAE,UAAU,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC,GACF,QAAQ,CAAC;IACP,IAAI,EAAE,SAAS,CAAC;CACjB,CAAC,CAAC;AAEP,MAAM,MAAM,cAAc,CAAC,EAAE,SAAS,eAAe,EAAE,KAAK,IAAI,CAC9D,YAAY,EAAE,YAAY,CAAC,EAAE,EAAE,KAAK,CAAC,EACrC,UAAU,EAAE,SAAS,CAAC,EAAE,CAAC,EACzB,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,KACpB,oBAAoB,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;AAqDrC,wBAAgB,oBAAoB,CAAC,EAAE,SAAS,eAAe,EAAE,KAAK,EACpE,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC,EAC7B,UAAU,EAAE,UAAU,CAAC,EAAE,EAAE,KAAK,CAAC,GAChC,cAAc,CAAC,EAAE,EAAE,KAAK,CAAC,CA8S3B"}
|
|
@@ -10,7 +10,7 @@ function resolveFoldTreeIndex(foldsApi, folds, foldTree) {
|
|
|
10
10
|
kind: 'notFound',
|
|
11
11
|
message: `Fold tree at index ${foldTree.index} not found.`,
|
|
12
12
|
};
|
|
13
|
-
case 'name':
|
|
13
|
+
case 'name': {
|
|
14
14
|
const index = foldsApi.getIndexByName(folds, foldTree.name);
|
|
15
15
|
return index === undefined
|
|
16
16
|
? {
|
|
@@ -21,13 +21,15 @@ function resolveFoldTreeIndex(foldsApi, folds, foldTree) {
|
|
|
21
21
|
kind: 'found',
|
|
22
22
|
index,
|
|
23
23
|
};
|
|
24
|
+
}
|
|
24
25
|
default: {
|
|
25
26
|
const _exhaustive = foldTree;
|
|
26
27
|
throw new Error(`Unhandled fold tree reference: ${JSON.stringify(_exhaustive)}`);
|
|
27
28
|
}
|
|
28
29
|
}
|
|
29
30
|
}
|
|
30
|
-
export function createEffectToAction(
|
|
31
|
+
export function createEffectToAction(stateApi, navNodeApi) {
|
|
32
|
+
const { cursorApi, foldsApi } = stateApi;
|
|
31
33
|
function action(reducerAction) {
|
|
32
34
|
return {
|
|
33
35
|
kind: 'action',
|
|
@@ -46,23 +48,25 @@ export function createEffectToAction(foldsApi, cursorApi, navNodeApi) {
|
|
|
46
48
|
};
|
|
47
49
|
}
|
|
48
50
|
function effectToAction(effectAction, navigation, state) {
|
|
51
|
+
const cursor = stateApi.getCursor(state);
|
|
52
|
+
const folds = stateApi.getFolds(state);
|
|
49
53
|
switch (effectAction.effectActionType) {
|
|
50
54
|
case 'nextEntry': {
|
|
51
|
-
const
|
|
52
|
-
return
|
|
55
|
+
const nextCursor = navNodeApi.nextCursor(navigation, cursor);
|
|
56
|
+
return nextCursor === undefined
|
|
53
57
|
? ignored()
|
|
54
58
|
: action({
|
|
55
59
|
kind: 'changeCursor',
|
|
56
|
-
cursor,
|
|
60
|
+
cursor: nextCursor,
|
|
57
61
|
});
|
|
58
62
|
}
|
|
59
63
|
case 'prevEntry': {
|
|
60
|
-
const
|
|
61
|
-
return
|
|
64
|
+
const previousCursor = navNodeApi.previousCursor(navigation, cursor);
|
|
65
|
+
return previousCursor === undefined
|
|
62
66
|
? ignored()
|
|
63
67
|
: action({
|
|
64
68
|
kind: 'changeCursor',
|
|
65
|
-
cursor,
|
|
69
|
+
cursor: previousCursor,
|
|
66
70
|
});
|
|
67
71
|
}
|
|
68
72
|
case 'setBranchEntries':
|
|
@@ -72,63 +76,113 @@ export function createEffectToAction(foldsApi, cursorApi, navNodeApi) {
|
|
|
72
76
|
entries: effectAction.entries,
|
|
73
77
|
});
|
|
74
78
|
case 'navigateToParent': {
|
|
75
|
-
// TODO:
|
|
76
|
-
// in state
|
|
79
|
+
// TODO: Encode the loaded-root invariant in the navigation type.
|
|
77
80
|
const navNode = navigation.children;
|
|
78
81
|
if (navNode === null) {
|
|
79
82
|
return ignored();
|
|
80
83
|
}
|
|
81
|
-
const
|
|
82
|
-
return
|
|
84
|
+
const parentCursor = navNodeApi.parentCursor(navNode, cursor);
|
|
85
|
+
return parentCursor === undefined
|
|
83
86
|
? ignored()
|
|
84
87
|
: action({
|
|
85
88
|
kind: 'changeCursor',
|
|
86
|
-
cursor,
|
|
89
|
+
cursor: parentCursor,
|
|
87
90
|
});
|
|
88
91
|
}
|
|
89
92
|
case 'addToFoldTree': {
|
|
90
|
-
const foldTree = resolveFoldTreeIndex(foldsApi,
|
|
93
|
+
const foldTree = resolveFoldTreeIndex(foldsApi, folds, effectAction.foldTree);
|
|
91
94
|
if (foldTree.kind === 'notFound') {
|
|
92
95
|
return rejected(foldTree.message);
|
|
93
96
|
}
|
|
94
|
-
|
|
97
|
+
// The root cannot be folded, and a fold marker is already folded.
|
|
98
|
+
if (!cursorApi.isNodeCursor(cursor) || cursor.path.length === 0) {
|
|
95
99
|
return ignored();
|
|
96
100
|
}
|
|
97
|
-
|
|
98
|
-
|
|
101
|
+
/*
|
|
102
|
+
* Adding an entry to an inactive fold tree does not change the
|
|
103
|
+
* navigation projection, so keep the cursor where it is.
|
|
104
|
+
*/
|
|
105
|
+
const nextCursor = foldsApi.isActiveAtIndex(folds, foldTree.index) === true
|
|
106
|
+
? navNodeApi.cursorAfterFold(navigation, cursor)
|
|
107
|
+
: cursor;
|
|
108
|
+
if (nextCursor === undefined) {
|
|
99
109
|
return ignored();
|
|
100
110
|
}
|
|
101
111
|
return action({
|
|
102
112
|
kind: 'addToFoldTree',
|
|
103
|
-
path:
|
|
104
|
-
cursor,
|
|
113
|
+
path: cursor.path,
|
|
114
|
+
cursor: nextCursor,
|
|
105
115
|
foldTreeIndex: foldTree.index,
|
|
106
116
|
});
|
|
107
117
|
}
|
|
108
118
|
case 'removeFromFoldTree': {
|
|
109
|
-
const foldTree = resolveFoldTreeIndex(foldsApi,
|
|
119
|
+
const foldTree = resolveFoldTreeIndex(foldsApi, folds, effectAction.foldTree);
|
|
110
120
|
if (foldTree.kind === 'notFound') {
|
|
111
121
|
return rejected(foldTree.message);
|
|
112
122
|
}
|
|
113
|
-
const currentPath = cursorApi.getPath(state.cursor);
|
|
114
123
|
const navNode = navigation.children;
|
|
115
|
-
// TODO:
|
|
124
|
+
// TODO: Encode the loaded-root invariant in the navigation type.
|
|
116
125
|
if (navNode === null) {
|
|
117
126
|
return ignored();
|
|
118
127
|
}
|
|
119
|
-
|
|
120
|
-
|
|
128
|
+
if (cursorApi.isFoldCursor(cursor)) {
|
|
129
|
+
const parent = navNodeApi.getNodeAtPath(navNode, cursor.parentPath);
|
|
130
|
+
const foldEntry = parent?.entries.find((entry) => {
|
|
131
|
+
if (!navNodeApi.entryIsFold(entry)) {
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
const firstEntry = entry.folded[0];
|
|
135
|
+
return (firstEntry !== undefined &&
|
|
136
|
+
!navNodeApi.entryIsFold(firstEntry) &&
|
|
137
|
+
firstEntry.id === cursor.firstId);
|
|
138
|
+
});
|
|
139
|
+
if (foldEntry === undefined || !navNodeApi.entryIsFold(foldEntry)) {
|
|
140
|
+
return ignored();
|
|
141
|
+
}
|
|
142
|
+
/*
|
|
143
|
+
* Remove only this fold tree's contribution to the selected
|
|
144
|
+
* ordered run. Other fold trees may still hide some entries.
|
|
145
|
+
*/
|
|
146
|
+
const entryIds = [];
|
|
147
|
+
for (const entry of foldEntry.folded) {
|
|
148
|
+
if (!navNodeApi.entryIsFold(entry) &&
|
|
149
|
+
foldsApi.isEntryHiddenInFoldAtPath(folds, foldTree.index, cursor.parentPath, entry.id)) {
|
|
150
|
+
entryIds.push(entry.id);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
const firstId = entryIds[0];
|
|
154
|
+
if (firstId === undefined) {
|
|
155
|
+
return ignored();
|
|
156
|
+
}
|
|
157
|
+
return action({
|
|
158
|
+
kind: 'removeFromFoldTree',
|
|
159
|
+
path: cursor.parentPath,
|
|
160
|
+
entryIds,
|
|
161
|
+
cursor: {
|
|
162
|
+
path: [...cursor.parentPath, firstId],
|
|
163
|
+
},
|
|
164
|
+
foldTreeIndex: foldTree.index,
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
/*
|
|
168
|
+
* In unordered navigation, folds are summarized on the selected
|
|
169
|
+
* parent. Reveal all direct entries hidden by this fold tree there.
|
|
170
|
+
*/
|
|
171
|
+
const node = navNodeApi.getNodeAtPath(navNode, cursor.path);
|
|
172
|
+
const hasFoldedEntries = node?.entries.some((entry) => navNodeApi.entryIsFold(entry) && entry.folded.length > 0);
|
|
173
|
+
if (!hasFoldedEntries) {
|
|
121
174
|
return ignored();
|
|
122
175
|
}
|
|
123
176
|
return action({
|
|
124
177
|
kind: 'removeFromFoldTree',
|
|
125
|
-
path:
|
|
126
|
-
|
|
178
|
+
path: cursor.path,
|
|
179
|
+
entryIds: null,
|
|
180
|
+
cursor,
|
|
127
181
|
foldTreeIndex: foldTree.index,
|
|
128
182
|
});
|
|
129
183
|
}
|
|
130
184
|
case 'fold': {
|
|
131
|
-
const foldTree = resolveFoldTreeIndex(foldsApi,
|
|
185
|
+
const foldTree = resolveFoldTreeIndex(foldsApi, folds, effectAction.foldTree);
|
|
132
186
|
return foldTree.kind === 'notFound'
|
|
133
187
|
? rejected(foldTree.message)
|
|
134
188
|
: action({
|
|
@@ -137,7 +191,7 @@ export function createEffectToAction(foldsApi, cursorApi, navNodeApi) {
|
|
|
137
191
|
});
|
|
138
192
|
}
|
|
139
193
|
case 'unfold': {
|
|
140
|
-
const foldTree = resolveFoldTreeIndex(foldsApi,
|
|
194
|
+
const foldTree = resolveFoldTreeIndex(foldsApi, folds, effectAction.foldTree);
|
|
141
195
|
return foldTree.kind === 'notFound'
|
|
142
196
|
? rejected(foldTree.message)
|
|
143
197
|
: action({
|
|
@@ -146,7 +200,7 @@ export function createEffectToAction(foldsApi, cursorApi, navNodeApi) {
|
|
|
146
200
|
});
|
|
147
201
|
}
|
|
148
202
|
case 'toggleFold': {
|
|
149
|
-
const foldTree = resolveFoldTreeIndex(foldsApi,
|
|
203
|
+
const foldTree = resolveFoldTreeIndex(foldsApi, folds, effectAction.foldTree);
|
|
150
204
|
return foldTree.kind === 'notFound'
|
|
151
205
|
? rejected(foldTree.message)
|
|
152
206
|
: action({
|
|
@@ -155,7 +209,7 @@ export function createEffectToAction(foldsApi, cursorApi, navNodeApi) {
|
|
|
155
209
|
});
|
|
156
210
|
}
|
|
157
211
|
case 'createFoldTree': {
|
|
158
|
-
const existingIndex = foldsApi.getIndexByName(
|
|
212
|
+
const existingIndex = foldsApi.getIndexByName(folds, effectAction.name);
|
|
159
213
|
return existingIndex === undefined
|
|
160
214
|
? action({
|
|
161
215
|
kind: 'createFoldTree',
|
|
@@ -164,7 +218,7 @@ export function createEffectToAction(foldsApi, cursorApi, navNodeApi) {
|
|
|
164
218
|
: rejected(`Fold tree named "${effectAction.name}" already exists.`);
|
|
165
219
|
}
|
|
166
220
|
case 'deleteFoldTree': {
|
|
167
|
-
const foldTreeIndex = foldsApi.getIndexByName(
|
|
221
|
+
const foldTreeIndex = foldsApi.getIndexByName(folds, effectAction.name);
|
|
168
222
|
if (foldTreeIndex === undefined) {
|
|
169
223
|
return rejected(`Fold tree named "${effectAction.name}" not found.`);
|
|
170
224
|
}
|
|
@@ -176,9 +230,10 @@ export function createEffectToAction(foldsApi, cursorApi, navNodeApi) {
|
|
|
176
230
|
name: effectAction.name,
|
|
177
231
|
});
|
|
178
232
|
}
|
|
179
|
-
default:
|
|
233
|
+
default: {
|
|
180
234
|
const _exhaustive = effectAction;
|
|
181
235
|
throw new Error(`Unhandled effect action: ${JSON.stringify(_exhaustive)}`);
|
|
236
|
+
}
|
|
182
237
|
}
|
|
183
238
|
}
|
|
184
239
|
return effectToAction;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Cursor, SerializableKey, State, TreeNode } from '../../
|
|
1
|
+
import type { Cursor, FoldIndex, SerializableKey, State, TreeNode } from '../../state-and-nav/index.js';
|
|
2
2
|
export type ReducerAction<Id extends SerializableKey, Value> = {
|
|
3
3
|
kind: 'changeCursor';
|
|
4
4
|
cursor: Cursor<Id>;
|
|
@@ -14,31 +14,37 @@ export type ReducerAction<Id extends SerializableKey, Value> = {
|
|
|
14
14
|
kind: 'addToFoldTree';
|
|
15
15
|
path: readonly Id[];
|
|
16
16
|
cursor: Cursor<Id>;
|
|
17
|
-
foldTreeIndex:
|
|
17
|
+
foldTreeIndex: FoldIndex;
|
|
18
18
|
} | {
|
|
19
19
|
kind: 'removeFromFoldTree';
|
|
20
|
+
/** Parent branch containing the hidden entries. */
|
|
20
21
|
path: readonly Id[];
|
|
22
|
+
/**
|
|
23
|
+
* null removes every direct hidden entry in this fold tree.
|
|
24
|
+
* An array removes only the specified entries of an inline fold run.
|
|
25
|
+
*/
|
|
26
|
+
entryIds: readonly Id[] | null;
|
|
21
27
|
cursor: Cursor<Id>;
|
|
22
|
-
foldTreeIndex:
|
|
28
|
+
foldTreeIndex: FoldIndex;
|
|
23
29
|
} | {
|
|
24
30
|
/**
|
|
25
31
|
* Activates a fold tree, making its hidden entries contribute to the
|
|
26
32
|
* visible navigation projection.
|
|
27
33
|
*/
|
|
28
34
|
kind: 'fold';
|
|
29
|
-
foldTreeIndex:
|
|
35
|
+
foldTreeIndex: FoldIndex;
|
|
30
36
|
} | {
|
|
31
37
|
/**
|
|
32
38
|
* Deactivates a fold tree while preserving its fold definition.
|
|
33
39
|
*/
|
|
34
40
|
kind: 'unfold';
|
|
35
|
-
foldTreeIndex:
|
|
41
|
+
foldTreeIndex: FoldIndex;
|
|
36
42
|
} | {
|
|
37
43
|
/**
|
|
38
44
|
* Inverts whether a fold tree contributes to hiding entries.
|
|
39
45
|
*/
|
|
40
46
|
kind: 'toggleFold';
|
|
41
|
-
foldTreeIndex:
|
|
47
|
+
foldTreeIndex: FoldIndex;
|
|
42
48
|
} | {
|
|
43
49
|
kind: 'createFoldTree';
|
|
44
50
|
name: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reducer-action.d.ts","sourceRoot":"","sources":["../../../src/app/reducer/reducer-action.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,MAAM,
|
|
1
|
+
{"version":3,"file":"reducer-action.d.ts","sourceRoot":"","sources":["../../../src/app/reducer/reducer-action.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,MAAM,EAAE,SAAS,EACjB,eAAe,EACf,KAAK,EACL,QAAQ,EACT,MAAM,8BAA8B,CAAC;AAEtC,MAAM,MAAM,aAAa,CAAC,EAAE,SAAS,eAAe,EAAE,KAAK,IACvD;IACE,IAAI,EAAE,cAAc,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;CACpB,GACD;IACE,IAAI,EAAE,cAAc,CAAC;IACrB,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC;IACpB,OAAO,EAAE,SAAS,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC;CAChD,GACD;IACE,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IAC3B,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;CAC5B,GACD;IACE,IAAI,EAAE,eAAe,CAAC;IACtB,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IACnB,aAAa,EAAE,SAAS,CAAC;CAC1B,GACD;IACE,IAAI,EAAE,oBAAoB,CAAC;IAC3B,mDAAmD;IACnD,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC;IAEpB;;;OAGG;IACH,QAAQ,EAAE,SAAS,EAAE,EAAE,GAAG,IAAI,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IACnB,aAAa,EAAE,SAAS,CAAC;CAC1B,GACD;IACE;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,SAAS,CAAC;CAC1B,GACD;IACE;;OAEG;IACH,IAAI,EAAE,QAAQ,CAAC;IACf,aAAa,EAAE,SAAS,CAAC;CAC1B,GACD;IACE;;OAEG;IACH,IAAI,EAAE,YAAY,CAAC;IACnB,aAAa,EAAE,SAAS,CAAC;CAC1B,GACD;IACE,IAAI,EAAE,gBAAgB,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;CACd,GACD;IACE,IAAI,EAAE,gBAAgB,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { NavMethods } from '../../state-and-nav/index.js';
|
|
2
|
+
import type { SerializableKey } from '../../state-and-nav/index.js';
|
|
3
|
+
import type { State, StateApi } from '../../state-and-nav/index.js';
|
|
2
4
|
import type { ReducerAction } from './reducer-action.js';
|
|
3
5
|
export type Reducer<Id extends SerializableKey, Value> = (state: State<Id, Value>, action: ReducerAction<Id, Value>) => State<Id, Value>;
|
|
4
|
-
export declare function createReducer<Id extends SerializableKey, Value>(
|
|
6
|
+
export declare function createReducer<Id extends SerializableKey, Value>(stateApi: StateApi<Id, Value>, navNodeApi: NavMethods<Id, Value>): Reducer<Id, Value>;
|
|
5
7
|
//# sourceMappingURL=reducer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reducer.d.ts","sourceRoot":"","sources":["../../../src/app/reducer/reducer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"reducer.d.ts","sourceRoot":"","sources":["../../../src/app/reducer/reducer.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,UAAU,EACX,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EACV,eAAe,EAChB,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAezD,MAAM,MAAM,OAAO,CAAC,EAAE,SAAS,eAAe,EAAE,KAAK,IAAI,CACvD,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,EACvB,MAAM,EAAE,aAAa,CAAC,EAAE,EAAE,KAAK,CAAC,KAC7B,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;AAEtB,wBAAgB,aAAa,CAAC,EAAE,SAAS,eAAe,EAAE,KAAK,EAC7D,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC,EAC7B,UAAU,EAAE,UAAU,CAAC,EAAE,EAAE,KAAK,CAAC,GAChC,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,CAkRpB"}
|