Skip to content

Commit fc1e17d

Browse files
committed
feat: use item belt to simplify
1 parent 27c6574 commit fc1e17d

File tree

6 files changed

+53
-64
lines changed

6 files changed

+53
-64
lines changed

denops/fall/component/help.ts

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import * as buffer from "jsr:@denops/std@^7.3.2/buffer";
66
import type { Dimension } from "jsr:@vim-fall/std@^0.4.0/coordinator";
77

88
import { BaseComponent } from "./_component.ts";
9+
import { ItemBelt } from "../lib/item_belt.ts";
910

1011
export type Page = {
1112
readonly title?: string;
@@ -14,31 +15,27 @@ export type Page = {
1415
};
1516

1617
export class HelpComponent extends BaseComponent {
17-
#page = 1;
18-
#pages: readonly Page[] = [];
18+
readonly #pages = new ItemBelt<Page>([]);
1919
#modifiedContent = true;
2020

2121
get page(): number {
22-
return this.#page;
22+
return this.#pages.index + 1;
2323
}
2424

2525
set page(page: number | "$") {
26-
if (page === "$" || page >= this.#pages.length) {
27-
page = this.#pages.length;
28-
} else if (page < 1) {
29-
page = 1;
26+
if (page === "$") {
27+
page = this.#pages.count;
3028
}
31-
this.#page = page;
29+
this.#pages.index = page - 1;
3230
this.#modifiedContent = true;
3331
}
3432

3533
get pages(): readonly Page[] {
36-
return this.#pages;
34+
return this.#pages.items;
3735
}
3836

3937
set pages(pages: readonly Page[]) {
40-
this.#pages = pages;
41-
this.page = this.#page;
38+
this.#pages.items = pages;
4239
this.#modifiedContent = true;
4340
}
4441

@@ -91,7 +88,7 @@ export class HelpComponent extends BaseComponent {
9188

9289
const { bufnr, dimension: { width } } = this.info;
9390

94-
const page = this.#pages.at(this.#page - 1);
91+
const page = this.#pages.current;
9592
const content = [
9693
await this.#buildNavigationHeader(denops, width, { signal }),
9794
...(page?.content ?? []),
@@ -129,7 +126,7 @@ export class HelpComponent extends BaseComponent {
129126
const prev = mappings.find((m) => m.rhs === "<Plug>(fall-help-prev)");
130127
const next = mappings.find((m) => m.rhs === "<Plug>(fall-help-next)");
131128
const navigator = [prev?.lhs, next?.lhs].filter((v) => !!v).join(" / ");
132-
const pager = `Page ${this.#page}/${this.#pages.length}`;
129+
const pager = `Page ${this.page}/${this.#pages.count}`;
133130
const spacer = " ".repeat(width - pager.length - navigator.length);
134131
return `${pager}${spacer}${navigator}`;
135132
}

denops/fall/processor/collect.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,13 @@ export type CollectProcessorOptions = {
1616
};
1717

1818
export class CollectProcessor<T extends Detail> implements Disposable {
19+
readonly #controller: AbortController = new AbortController();
20+
readonly #items: IdItem<T>[] = [];
1921
readonly #source: Source<T>;
2022
readonly #threshold: number;
2123
readonly #chunkSize: number;
22-
readonly #controller: AbortController = new AbortController();
2324
#processing?: Promise<void>;
2425
#paused?: PromiseWithResolvers<void>;
25-
readonly #items: IdItem<T>[] = [];
2626

2727
constructor(
2828
source: Source<T>,

denops/fall/processor/match.ts

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import type { Detail, IdItem } from "jsr:@vim-fall/std@^0.4.0/item";
55
import type { Matcher, MatchParams } from "jsr:@vim-fall/std@^0.4.0/matcher";
66

77
import { Chunker } from "../lib/chunker.ts";
8+
import { ItemBelt } from "../lib/item_belt.ts";
89
import { dispatch } from "../event.ts";
910

1011
const INTERVAL = 0;
@@ -19,7 +20,7 @@ export type MatchProcessorOptions = {
1920
};
2021

2122
export class MatchProcessor<T extends Detail> implements Disposable {
22-
readonly #matchers: readonly [Matcher<T>, ...Matcher<T>[]];
23+
readonly #matchers: ItemBelt<Matcher<T>>;
2324
readonly #interval: number;
2425
readonly #threshold: number;
2526
readonly #chunkSize: number;
@@ -28,42 +29,39 @@ export class MatchProcessor<T extends Detail> implements Disposable {
2829
#processing?: Promise<void>;
2930
#reserved?: () => void;
3031
#items: IdItem<T>[] = [];
31-
#matcherIndex = 0;
3232

3333
constructor(
34-
filters: readonly [Matcher<T>, ...Matcher<T>[]],
34+
matchers: readonly [Matcher<T>, ...Matcher<T>[]],
3535
options: MatchProcessorOptions = {},
3636
) {
37-
this.#matchers = filters;
37+
this.#matchers = new ItemBelt(matchers);
3838
this.#interval = options.interval ?? INTERVAL;
3939
this.#threshold = options.threshold ?? THRESHOLD;
4040
this.#chunkSize = options.chunkSize ?? CHUNK_SIZE;
4141
this.#incremental = options.incremental ?? false;
4242
}
4343

4444
get #matcher(): Matcher<T> {
45-
return this.#matchers[this.#matcherIndex];
45+
return this.#matchers.current!;
4646
}
4747

4848
get items(): IdItem<T>[] {
4949
return this.#items;
5050
}
5151

5252
get matcherCount(): number {
53-
return this.#matchers.length;
53+
return this.#matchers.count;
5454
}
5555

5656
get matcherIndex(): number {
57-
return this.#matcherIndex;
57+
return this.#matchers.index;
5858
}
5959

6060
set matcherIndex(index: number | "$") {
61-
if (index === "$" || index >= this.#matchers.length) {
62-
index = this.#matchers.length - 1;
63-
} else if (index < 0) {
64-
index = 0;
61+
if (index === "$") {
62+
index = this.#matchers.count;
6563
}
66-
this.#matcherIndex = index;
64+
this.#matchers.index = index;
6765
}
6866

6967
#validateAvailability(): void {

denops/fall/processor/preview.ts

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,39 +5,37 @@ import type {
55
PreviewParams,
66
} from "jsr:@vim-fall/std@^0.4.0/previewer";
77

8+
import { ItemBelt } from "../lib/item_belt.ts";
89
import { dispatch } from "../event.ts";
910

1011
export class PreviewProcessor<T extends Detail> implements Disposable {
11-
readonly #previewers: Previewer<T>[];
1212
readonly #controller: AbortController = new AbortController();
13+
readonly #previewers: ItemBelt<Previewer<T>>;
1314
#processing?: Promise<void>;
1415
#reserved?: () => void;
1516
#item: PreviewItem | undefined = undefined;
16-
#previewerIndex = 0;
1717

18-
constructor(previewers: Previewer<T>[]) {
19-
this.#previewers = previewers;
18+
constructor(previewers: readonly Previewer<T>[]) {
19+
this.#previewers = new ItemBelt(previewers);
2020
}
2121

2222
get #previewer(): Previewer<T> | undefined {
23-
return this.#previewers[this.#previewerIndex];
23+
return this.#previewers.current;
2424
}
2525

2626
get previewerCount(): number {
27-
return this.#previewers.length;
27+
return this.#previewers.count;
2828
}
2929

3030
get previewerIndex(): number {
31-
return this.#previewerIndex;
31+
return this.#previewers.index;
3232
}
3333

3434
set previewerIndex(index: number | "$") {
35-
if (index === "$" || index >= this.#previewers.length) {
36-
index = this.#previewers.length - 1;
37-
} else if (index < 0) {
38-
index = 0;
35+
if (index === "$") {
36+
index = this.#previewers.count;
3937
}
40-
this.#previewerIndex = index;
38+
this.#previewers.index = index;
4139
}
4240

4341
get item(): PreviewItem | undefined {

denops/fall/processor/render.ts

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import type {
77
import type { Renderer } from "jsr:@vim-fall/std@^0.4.0/renderer";
88

99
import { adjustOffset } from "../lib/adjust_offset.ts";
10+
import { ItemBelt } from "../lib/item_belt.ts";
1011
import { dispatch } from "../event.ts";
1112

1213
const HEIGHT = 10;
@@ -18,46 +19,43 @@ export type RenderProcessorOptions = {
1819
};
1920

2021
export class RenderProcessor<T extends Detail> implements Disposable {
21-
readonly #renderers: Renderer<T>[];
22+
readonly #controller: AbortController = new AbortController();
23+
readonly #renderers: ItemBelt<Renderer<T>>;
2224
#height: number;
2325
#scrollOffset: number;
24-
readonly #controller: AbortController = new AbortController();
2526
#processing?: Promise<void>;
2627
#reserved?: () => void;
2728
#items: DisplayItem<T>[] = [];
2829
#itemCount: number = 0;
2930
#cursor: number = 0;
3031
#offset: number = 0;
31-
#rendererIndex: number = 0;
3232

3333
constructor(
34-
renderers: Renderer<T>[],
34+
renderers: readonly Renderer<T>[],
3535
options: RenderProcessorOptions = {},
3636
) {
37-
this.#renderers = renderers;
37+
this.#renderers = new ItemBelt(renderers);
3838
this.#height = options.height ?? HEIGHT;
3939
this.#scrollOffset = options.scrollOffset ?? SCROLL_OFFSET;
4040
}
4141

4242
get #renderer(): Renderer<T> | undefined {
43-
return this.#renderers.at(this.#rendererIndex);
43+
return this.#renderers.current;
4444
}
4545

4646
get rendererCount(): number {
47-
return this.#renderers.length;
47+
return this.#renderers.count;
4848
}
4949

5050
get rendererIndex(): number {
51-
return this.#rendererIndex;
51+
return this.#renderers.index;
5252
}
5353

5454
set rendererIndex(index: number | "$") {
55-
if (index === "$" || index >= this.rendererCount) {
56-
index = this.rendererCount - 1;
57-
} else if (index < 0) {
58-
index = 0;
55+
if (index === "$") {
56+
index = this.#renderers.count;
5957
}
60-
this.#rendererIndex = index;
58+
this.#renderers.index = index;
6159
}
6260

6361
get items() {

denops/fall/processor/sort.ts

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,39 +2,37 @@ import type { Denops } from "jsr:@denops/std@^7.3.2";
22
import type { Detail, IdItem } from "jsr:@vim-fall/std@^0.4.0/item";
33
import type { Sorter } from "jsr:@vim-fall/std@^0.4.0/sorter";
44

5+
import { ItemBelt } from "../lib/item_belt.ts";
56
import { dispatch } from "../event.ts";
67

78
export class SortProcessor<T extends Detail> implements Disposable {
8-
readonly #sorters: Sorter<T>[];
99
readonly #controller: AbortController = new AbortController();
10+
readonly #sorters: ItemBelt<Sorter<T>>;
1011
#processing?: Promise<void>;
1112
#reserved?: () => void;
1213
#items: IdItem<T>[] = [];
13-
#sorterIndex: number = 0;
1414

15-
constructor(sorters: Sorter<T>[]) {
16-
this.#sorters = sorters;
15+
constructor(sorters: readonly Sorter<T>[]) {
16+
this.#sorters = new ItemBelt(sorters);
1717
}
1818

1919
get #sorter(): Sorter<T> | undefined {
20-
return this.#sorters.at(this.#sorterIndex);
20+
return this.#sorters.current;
2121
}
2222

2323
get sorterCount(): number {
24-
return this.#sorters.length;
24+
return this.#sorters.count;
2525
}
2626

2727
get sorterIndex(): number {
28-
return this.#sorterIndex;
28+
return this.#sorters.index;
2929
}
3030

3131
set sorterIndex(index: number | "$") {
32-
if (index === "$" || index >= this.sorterCount) {
33-
index = this.sorterCount - 1;
34-
} else if (index < 0) {
35-
index = 0;
32+
if (index === "$") {
33+
index = this.#sorters.count;
3634
}
37-
this.#sorterIndex = index;
35+
this.#sorters.index = index;
3836
}
3937

4038
get items() {

0 commit comments

Comments
 (0)