Skip to content

Commit 6c1e8b3

Browse files
authored
Refactor TreeView.ts (#129)
Removes taking a dependency on `VsCode` in the service interface and instead the constructor. This prevents `createTreeDataProvider` from "leaking" the requirement.
1 parent a04c7a6 commit 6c1e8b3

File tree

1 file changed

+29
-52
lines changed

1 file changed

+29
-52
lines changed

extension/src/views/TreeView.ts

Lines changed: 29 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -27,28 +27,25 @@ import { VsCode } from "../services/VsCode.ts";
2727
*/
2828
export class TreeView extends Effect.Service<TreeView>()("TreeView", {
2929
scoped: Effect.gen(function* () {
30-
yield* VsCode;
30+
const code = yield* VsCode;
3131

3232
return {
3333
/**
3434
* Creates a tree data provider with automatic cleanup on scope disposal.
3535
*
3636
* @param options - Configuration for the tree view
3737
*/
38-
createTreeDataProvider<T>(options: {
38+
createTreeDataProvider: Effect.fnUntraced(function* <T>(options: {
3939
viewId: MarimoView;
4040
getChildren: (element?: T) => Effect.Effect<T[], never, never>;
4141
getTreeItem: (element: T) => Effect.Effect<TreeItem, never, never>;
4242
getParent?: (element: T) => Effect.Effect<T | undefined, never, never>;
4343
}) {
44-
return Effect.gen(function* () {
45-
const code = yield* VsCode;
44+
// Create event emitter for refresh events
45+
const eventEmitter = new code.EventEmitter<T | undefined | null>();
4646

47-
// Create event emitter for refresh events
48-
const eventEmitter = new code.EventEmitter<T | undefined | null>();
49-
50-
// Create the tree data provider implementation
51-
const provider: vscode.TreeDataProvider<T> = {
47+
const treeView = yield* code.window.createTreeView(options.viewId, {
48+
treeDataProvider: {
5249
onDidChangeTreeData: eventEmitter.event,
5350

5451
getTreeItem: (element: T): vscode.TreeItem => {
@@ -76,51 +73,31 @@ export class TreeView extends Effect.Service<TreeView>()("TreeView", {
7673
);
7774
}
7875
: undefined,
79-
};
80-
81-
// Register the tree data provider
82-
const treeView = yield* code.window.createTreeView(options.viewId, {
83-
treeDataProvider: provider,
84-
showCollapseAll: true,
85-
});
86-
87-
return {
88-
/**
89-
* Refreshes the entire tree view.
90-
*/
91-
refresh(element?: T) {
92-
return Effect.sync(() => eventEmitter.fire(element ?? null));
93-
},
94-
95-
/**
96-
* Reveals an element in the tree view.
97-
*/
98-
reveal(
99-
element: T,
100-
options?: { select?: boolean; focus?: boolean; expand?: boolean },
101-
) {
102-
return Effect.promise(() => treeView.reveal(element, options));
103-
},
104-
105-
/**
106-
* Direct access to the underlying VS Code TreeView.
107-
* Use with caution - prefer the provided methods.
108-
*/
109-
get raw() {
110-
return treeView;
111-
},
112-
113-
/**
114-
* Get the event emitter for manual control.
115-
*/
116-
get eventEmitter() {
117-
return eventEmitter;
118-
},
119-
};
76+
},
77+
showCollapseAll: true,
12078
});
121-
},
79+
80+
return {
81+
/**
82+
* Refreshes the entire tree view.
83+
*/
84+
refresh(element?: T) {
85+
return Effect.sync(() => eventEmitter.fire(element ?? null));
86+
},
87+
88+
/**
89+
* Reveals an element in the tree view.
90+
*/
91+
reveal(
92+
element: T,
93+
options?: { select?: boolean; focus?: boolean; expand?: boolean },
94+
) {
95+
return Effect.promise(() => treeView.reveal(element, options));
96+
},
97+
};
98+
}),
12299
};
123-
}).pipe(Effect.annotateLogs("service", "TreeView")),
100+
}),
124101
}) {}
125102

126103
/**

0 commit comments

Comments
 (0)