Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commite920316

Browse files
authored
refactor: Extract explorer cache related code (LeetCode-OpenSource#301)
1 parentde5f70d commite920316

File tree

4 files changed

+203
-165
lines changed

4 files changed

+203
-165
lines changed

‎src/explorer/LeetCodeNode.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ import { Command } from "vscode";
55
import{IProblem,ProblemState}from"../shared";
66

77
exportclassLeetCodeNode{
8-
constructor(privatedata:IProblem,privateparentNodeName:string,privateisProblemNode:boolean=true){}
8+
9+
constructor(privatedata:IProblem,privateisProblemNode:boolean=true){}
910

1011
publicgetlocked():boolean{
1112
returnthis.data.locked;
@@ -46,10 +47,6 @@ export class LeetCodeNode {
4647
returnthis.isProblemNode;
4748
}
4849

49-
publicgetparentName():string{
50-
returnthis.parentNodeName;
51-
}
52-
5350
publicgetpreviewCommand():Command{
5451
return{
5552
title:"Preview Problem",
Lines changed: 21 additions & 160 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,24 @@
11
// Copyright (c) jdneo. All rights reserved.
22
// Licensed under the MIT license.
33

4-
import*as_from"lodash";
54
import*asosfrom"os";
65
import*aspathfrom"path";
76
import*asvscodefrom"vscode";
8-
import*aslistfrom"../commands/list";
9-
import{leetCodeChannel}from"../leetCodeChannel";
107
import{leetCodeManager}from"../leetCodeManager";
11-
import{Category,defaultProblem,IProblem,ProblemState}from"../shared";
12-
import{getWorkspaceConfiguration}from"../utils/workspaceUtils";
8+
import{Category,defaultProblem,ProblemState}from"../shared";
9+
import{explorerNodeManager}from"./explorerNodeManager";
1310
import{LeetCodeNode}from"./LeetCodeNode";
1411

1512
exportclassLeetCodeTreeDataProviderimplementsvscode.TreeDataProvider<LeetCodeNode>{
1613

17-
privatetreeData:{
18-
Difficulty:Map<string,IProblem[]>,
19-
Tag:Map<string,IProblem[]>,
20-
Company:Map<string,IProblem[]>,
21-
Favorite:IProblem[],
22-
};
23-
2414
privateonDidChangeTreeDataEvent:vscode.EventEmitter<any>=newvscode.EventEmitter<any>();
2515
// tslint:disable-next-line:member-ordering
2616
publicreadonlyonDidChangeTreeData:vscode.Event<any>=this.onDidChangeTreeDataEvent.event;
2717

2818
constructor(privatecontext:vscode.ExtensionContext){}
2919

3020
publicasyncrefresh():Promise<void>{
31-
awaitthis.getProblemData();
21+
awaitexplorerNodeManager.refreshCache();
3222
this.onDidChangeTreeDataEvent.fire();
3323
}
3424

@@ -49,7 +39,7 @@ export class LeetCodeTreeDataProvider implements vscode.TreeDataProvider<LeetCod
4939
return{
5040
label:element.isProblem ?`[${element.id}]${element.name}` :element.name,
5141
tooltip:this.getSubCategoryTooltip(element),
52-
id:`${idPrefix}.${element.parentName}.${element.id}`,
42+
id:`${idPrefix}.${element.id}`,
5343
collapsibleState:element.isProblem ?vscode.TreeItemCollapsibleState.None :vscode.TreeItemCollapsibleState.Collapsed,
5444
contextValue:element.isProblem ?"problem" :element.id.toLowerCase(),
5545
iconPath:this.parseIconPathFromProblemState(element),
@@ -63,91 +53,28 @@ export class LeetCodeTreeDataProvider implements vscode.TreeDataProvider<LeetCod
6353
newLeetCodeNode(Object.assign({},defaultProblem,{
6454
id:"notSignIn",
6555
name:"Sign in to LeetCode",
66-
}),"ROOT",false),
56+
}),false),
6757
];
6858
}
6959
if(!element){// Root view
70-
return[
71-
newLeetCodeNode(Object.assign({},defaultProblem,{
72-
id:Category.Difficulty,
73-
name:Category.Difficulty,
74-
}),"ROOT",false),
75-
newLeetCodeNode(Object.assign({},defaultProblem,{
76-
id:Category.Tag,
77-
name:Category.Tag,
78-
}),"ROOT",false),
79-
newLeetCodeNode(Object.assign({},defaultProblem,{
80-
id:Category.Company,
81-
name:Category.Company,
82-
}),"ROOT",false),
83-
newLeetCodeNode(Object.assign({},defaultProblem,{
84-
id:Category.Favorite,
85-
name:Category.Favorite,
86-
}),"ROOT",false),
87-
];
60+
returnexplorerNodeManager.getRootNodes();
8861
}else{
89-
switch(element.name){// First-level
62+
switch(element.id){// First-level
9063
caseCategory.Favorite:
91-
constnodes:IProblem[]=this.treeData[Category.Favorite];
92-
returnnodes.map((p:IProblem)=>newLeetCodeNode(p,Category.Favorite));
64+
returnexplorerNodeManager.getFavoriteNodes();
9365
caseCategory.Difficulty:
66+
returnexplorerNodeManager.getAllDifficultyNodes();
9467
caseCategory.Tag:
68+
returnexplorerNodeManager.getAllTagNodes();
9569
caseCategory.Company:
96-
returnthis.composeSubCategoryNodes(element);
97-
default:// Second and lower levels
98-
returnelement.isProblem ?[] :this.composeProblemNodes(element);
99-
}
100-
}
101-
}
102-
103-
privateasyncgetProblemData():Promise<void>{
104-
// clear cache
105-
this.treeData={
106-
Difficulty:newMap<string,IProblem[]>(),
107-
Tag:newMap<string,IProblem[]>(),
108-
Company:newMap<string,IProblem[]>(),
109-
Favorite:[],
110-
};
111-
for(constproblemofawaitlist.listProblems()){
112-
// Add favorite problem, no matter whether it is solved.
113-
if(problem.isFavorite){
114-
this.treeData[Category.Favorite].push(problem);
115-
}
116-
// Hide solved problem in other category.
117-
if(problem.state===ProblemState.AC&&getWorkspaceConfiguration().get<boolean>("hideSolved")){
118-
continue;
70+
returnexplorerNodeManager.getAllCompanyNodes();
71+
default:
72+
if(element.isProblem){
73+
return[];
74+
}
75+
returnexplorerNodeManager.getChildrenNodesById(element.id);
11976
}
120-
121-
this.addProblemToTreeData(problem);
122-
}
123-
}
124-
125-
privatecomposeProblemNodes(node:LeetCodeNode):LeetCodeNode[]{
126-
constmap:Map<string,IProblem[]>|undefined=this.treeData[node.parentName];
127-
if(!map){
128-
leetCodeChannel.appendLine(`Category:${node.parentName} is not available.`);
129-
return[];
130-
}
131-
constproblems:IProblem[]=map.get(node.name)||[];
132-
constproblemNodes:LeetCodeNode[]=[];
133-
for(constproblemofproblems){
134-
problemNodes.push(newLeetCodeNode(problem,node.name));
13577
}
136-
returnproblemNodes;
137-
}
138-
139-
privatecomposeSubCategoryNodes(node:LeetCodeNode):LeetCodeNode[]{
140-
constcategory:Category=node.nameasCategory;
141-
if(category===Category.Favorite){
142-
leetCodeChannel.appendLine("No sub-level for Favorite nodes");
143-
return[];
144-
}
145-
constmap:Map<string,IProblem[]>|undefined=this.treeData[category];
146-
if(!map){
147-
leetCodeChannel.appendLine(`Category:${category} is not available.`);
148-
return[];
149-
}
150-
returnthis.getSubCategoryNodes(map,category);
15178
}
15279

15380
privateparseIconPathFromProblemState(element:LeetCodeNode):string{
@@ -171,16 +98,16 @@ export class LeetCodeTreeDataProvider implements vscode.TreeDataProvider<LeetCod
17198

17299
privategetSubCategoryTooltip(element:LeetCodeNode):string{
173100
// return '' unless it is a sub-category node
174-
if(element.isProblem||!this.treeData[element.parentName]){
101+
if(element.isProblem||element.id==="ROOT"||element.idinCategory){
175102
return"";
176103
}
177104

178-
constproblems:IProblem[]=this.treeData[element.parentName].get(element.id);
105+
constchildernNodes:LeetCodeNode[]=explorerNodeManager.getChildrenNodesById(element.id);
179106

180107
letacceptedNum:number=0;
181108
letfailedNum:number=0;
182-
for(constprobofproblems){
183-
switch(prob.state){
109+
for(constnodeofchildernNodes){
110+
switch(node.state){
184111
caseProblemState.AC:
185112
acceptedNum++;
186113
break;
@@ -195,73 +122,7 @@ export class LeetCodeTreeDataProvider implements vscode.TreeDataProvider<LeetCod
195122
return[
196123
`AC:${acceptedNum}`,
197124
`Failed:${failedNum}`,
198-
`Total:${problems.length}`,
125+
`Total:${childernNodes.length}`,
199126
].join(os.EOL);
200127
}
201-
202-
privateaddProblemToTreeData(problem:IProblem):void{
203-
this.putProblemToMap(this.treeData.Difficulty,problem.difficulty,problem);
204-
for(consttagofproblem.tags){
205-
this.putProblemToMap(this.treeData.Tag,_.startCase(tag),problem);
206-
}
207-
for(constcompanyofproblem.companies){
208-
this.putProblemToMap(this.treeData.Company,_.startCase(company),problem);
209-
}
210-
}
211-
212-
privateputProblemToMap(map:Map<string,IProblem[]>,key:string,problem:IProblem):void{
213-
constproblems:IProblem[]|undefined=map.get(key);
214-
if(problems){
215-
problems.push(problem);
216-
}else{
217-
map.set(key,[problem]);
218-
}
219-
}
220-
221-
privategetSubCategoryNodes(map:Map<string,IProblem[]>,category:Category):LeetCodeNode[]{
222-
constsubCategoryNodes:LeetCodeNode[]=Array.from(map.keys()).map((subCategory:string)=>{
223-
returnnewLeetCodeNode(Object.assign({},defaultProblem,{
224-
id:subCategory,
225-
name:subCategory,
226-
}),category.toString(),false);
227-
});
228-
this.sortSubCategoryNodes(subCategoryNodes,category);
229-
returnsubCategoryNodes;
230-
}
231-
232-
privatesortSubCategoryNodes(subCategoryNodes:LeetCodeNode[],category:Category):void{
233-
switch(category){
234-
caseCategory.Difficulty:
235-
subCategoryNodes.sort((a:LeetCodeNode,b:LeetCodeNode):number=>{
236-
functiongetValue(input:LeetCodeNode):number{
237-
switch(input.name.toLowerCase()){
238-
case"easy":
239-
return1;
240-
case"medium":
241-
return2;
242-
case"hard":
243-
return3;
244-
default:
245-
returnNumber.MAX_SAFE_INTEGER;
246-
}
247-
}
248-
returngetValue(a)-getValue(b);
249-
});
250-
break;
251-
caseCategory.Tag:
252-
caseCategory.Company:
253-
subCategoryNodes.sort((a:LeetCodeNode,b:LeetCodeNode):number=>{
254-
if(a.name==="Unknown"){
255-
return1;
256-
}elseif(b.name==="Unknown"){
257-
return-1;
258-
}else{
259-
returnNumber(a.name>b.name)-Number(a.name<b.name);
260-
}
261-
});
262-
break;
263-
default:
264-
break;
265-
}
266-
}
267128
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp