diff --git a/README.md b/README.md index c441e67..9a44902 100644 --- a/README.md +++ b/README.md @@ -96,9 +96,9 @@ buf.insert(11, "\n"); assertEquals(buf.count, 12); assertEquals(buf.line_count, 3); assertEquals(buf.read(0).toArray().join(""), "Lorem\nipsum\n"); -assertEquals(buf.read([0, 0], [1, 0]).toArray().join(""), "Lorem\n"); -assertEquals(buf.read([1, 0], [2, 0]).toArray().join(""), "ipsum\n"); -assertEquals(buf.read([2, 0], [3, 0]).toArray().join(""), ""); +assertEquals(buf.read2([0, 0], [1, 0]).toArray().join(""), "Lorem\n"); +assertEquals(buf.read2([1, 0], [2, 0]).toArray().join(""), "ipsum\n"); +assertEquals(buf.read2([2, 0], [3, 0]).toArray().join(""), ""); buf.delete(0, 6); buf.delete(5, 6); @@ -106,7 +106,7 @@ buf.delete(5, 6); assertEquals(buf.count, 5); assertEquals(buf.line_count, 1); assertEquals(buf.read(0).toArray().join(""), "ipsum"); -assertEquals(buf.read([0, 0], [1, 0]).toArray().join(""), "ipsum"); +assertEquals(buf.read2([0, 0], [1, 0]).toArray().join(""), "ipsum"); ``` ## API @@ -214,12 +214,12 @@ assertEquals(buf.read(0).toArray().join(""), "0"); ### `TextBuf.proto.read()` Returns text in the buffer's section, specified by start (inclusive) and end -(exclusive) positions. +(exclusive) indexes. Syntax ```ts ignore -read(start: Position, end?: Position): Generator +*read(start: number, end = Number.MAX_SAFE_INTEGER): Generator ``` Example @@ -232,18 +232,39 @@ const buf = new TextBuf("Lorem\nipsum"); assertEquals(buf.read(0).toArray().join(""), "Lorem\nipsum"); assertEquals(buf.read(6).toArray().join(""), "ipsum"); -assertEquals(buf.read([0, 0], [1, 0]).toArray().join(""), "Lorem\n"); -assertEquals(buf.read([1, 0], [2, 0]).toArray().join(""), "ipsum"); +``` + +### `TextBuf.proto.read2()` + +Returns text in the buffer's section, specified by start (inclusive) and end +(exclusive) positions. + +Syntax + +```ts ignore +*read2(start: [number, number], end?: [number, number]): Generator +``` + +Example + +```ts +import { assertEquals } from "jsr:@std/assert"; +import { TextBuf } from "jsr:@eu-ge-ne/text-buf"; + +const buf = new TextBuf("Lorem\nipsum"); + +assertEquals(buf.read2([0, 0], [1, 0]).toArray().join(""), "Lorem\n"); +assertEquals(buf.read2([1, 0], [2, 0]).toArray().join(""), "ipsum"); ``` ### `TextBuf.proto.insert()` -Inserts text into the buffer at the specified position +Inserts text into the buffer at the specified index. Syntax ```ts ignore -insert(pos: Position, text: string): void +insert(i: number, text: string): void ``` Example @@ -255,7 +276,31 @@ import { TextBuf } from "jsr:@eu-ge-ne/text-buf"; const buf = new TextBuf(); buf.insert(0, "Lorem"); -buf.insert([0, 5], " ipsum"); +buf.insert(5, " ipsum"); + +assertEquals(buf.read(0).toArray().join(""), "Lorem ipsum"); +``` + +### `TextBuf.proto.insert2()` + +Inserts text into the buffer at the specified position. + +Syntax + +```ts ignore +insert2(pos: [number, number], text: string): void +``` + +Example + +```ts +import { assertEquals } from "jsr:@std/assert"; +import { TextBuf } from "jsr:@eu-ge-ne/text-buf"; + +const buf = new TextBuf(); + +buf.insert2([0, 0], "Lorem"); +buf.insert2([0, 5], " ipsum"); assertEquals(buf.read(0).toArray().join(""), "Lorem ipsum"); ``` @@ -311,12 +356,12 @@ assertEquals(buf.read(0).toArray().join(""), ""); ### `TextBuf.proto.delete()` Removes characters in the buffer's section, specified by start (inclusive) and -end (exclusive) positions. +end (exclusive) indexes. Syntax ```ts ignore -delete(start: Position, end?: Position): void +delete(start: number, end = Number.MAX_SAFE_INTEGER): void ``` Example @@ -332,6 +377,30 @@ buf.delete(5, 11); assertEquals(buf.read(0).toArray().join(""), "Lorem"); ``` +### `TextBuf.proto.delete2()` + +Removes characters in the buffer's section, specified by start (inclusive) and +end (exclusive) positions. + +Syntax + +```ts ignore +delete2(start: [number, number], end?: [number, number]): void +``` + +Example + +```ts +import { assertEquals } from "jsr:@std/assert"; +import { TextBuf } from "jsr:@eu-ge-ne/text-buf"; + +const buf = new TextBuf("Lorem ipsum"); + +buf.delete2([0, 5], [0, 11]); + +assertEquals(buf.read(0).toArray().join(""), "Lorem"); +``` + ## Benchmarks ### Create diff --git a/codecov.yml b/codecov.yml index b5ed579..bfdc987 100644 --- a/codecov.yml +++ b/codecov.yml @@ -2,7 +2,7 @@ coverage: status: project: default: - target: 99% + informational: true patch: default: - target: 99% + informational: true diff --git a/deno.json b/deno.json index db1ce79..61c13d5 100644 --- a/deno.json +++ b/deno.json @@ -1,6 +1,6 @@ { "name": "@eu-ge-ne/text-buf", - "version": "0.13.6", + "version": "0.14.0", "license": "MIT", "exports": "./src/mod.ts", "imports": { diff --git a/src/mod.ts b/src/mod.ts index 9cd781a..c0d6ef1 100644 --- a/src/mod.ts +++ b/src/mod.ts @@ -1,3 +1,2 @@ export type { Node } from "./node.ts"; -export type { Pos } from "./position.ts"; export { TextBuf } from "./text-buf.ts"; diff --git a/src/position.ts b/src/position.ts deleted file mode 100644 index fd70629..0000000 --- a/src/position.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Represents position in text buffer. - * Can be either `number` or `[number, number]`: - * - `number` is an offset from the start of buffer - * - `[number, number]` are [line, column] indexes - */ -export type Pos = number | readonly [number, number]; diff --git a/src/text-buf.ts b/src/text-buf.ts index 6bcb4ae..89dd026 100644 --- a/src/text-buf.ts +++ b/src/text-buf.ts @@ -8,7 +8,6 @@ import { type Node, successor, } from "./node.ts"; -import type { Pos } from "./position.ts"; export const enum InsertionCase { Root, @@ -127,10 +126,10 @@ export class TextBuf { } /** - * Returns text in the buffer's section, specified by start (inclusive) and end (exclusive) positions. + * Returns text in the buffer's section, specified by start (inclusive) and end (exclusive) indexes. * - * @param `start` Start position. - * @param `end` Optional end position. + * @param `start` Start index. + * @param `end` Optional end index. * @returns Text. * * @example @@ -143,34 +142,51 @@ export class TextBuf { * * assertEquals(buf.read(0).toArray().join(""), "Lorem\nipsum"); * assertEquals(buf.read(6).toArray().join(""), "ipsum"); - * assertEquals(buf.read([0, 0], [1, 0]).toArray().join(""), "Lorem\n"); - * assertEquals(buf.read([1, 0], [2, 0]).toArray().join(""), "ipsum"); * ``` */ - *read(start: Pos, end?: Pos): Generator { - const start_i = this.#pos_to_index(start); - if (typeof start_i === "undefined") { - return; - } - - const first = this.#find(start_i); + *read(start: number, end = Number.MAX_SAFE_INTEGER): Generator { + const first = this.#find(start); if (!first) { return; } const { node, offset } = first; - const end_i = (end ? this.#pos_to_index(end) : undefined) ?? - Number.MAX_SAFE_INTEGER; - const n = end_i - start_i; + yield* this.#read(node, offset, end - start); + } + + /** + * Returns text in the buffer's section, specified by start (inclusive) and end (exclusive) positions. + * + * @param `start` Start position. + * @param `end` Optional end position. + * @returns Text. + * + * @example + * + * ```ts + * import { assertEquals } from "jsr:@std/assert"; + * import { TextBuf } from "jsr:@eu-ge-ne/text-buf"; + * + * const buf = new TextBuf("Lorem\nipsum"); + * + * assertEquals(buf.read2([0, 0], [1, 0]).toArray().join(""), "Lorem\n"); + * assertEquals(buf.read2([1, 0], [2, 0]).toArray().join(""), "ipsum"); + * ``` + */ + *read2(start: [number, number], end?: [number, number]): Generator { + const i = this.#pos_to_index(start); + if (typeof i !== "number") { + return; + } - yield* this.#read(node, offset, n); + yield* this.read(i, this.#pos_to_index(end)); } /** - * Inserts text into the buffer at the specified position + * Inserts text into the buffer at the specified index. * - * @param `pos` Position at witch to insert the text + * @param `i` Index at witch to insert the text * @param `text` Text to insert * * @example @@ -182,15 +198,13 @@ export class TextBuf { * const buf = new TextBuf(); * * buf.insert(0, "Lorem"); - * buf.insert([0, 5], " ipsum"); + * buf.insert(5, " ipsum"); * * assertEquals(buf.read(0).toArray().join(""), "Lorem ipsum"); * ``` */ - insert(pos: Pos, text: string): void { - let i = this.#pos_to_index(pos); - - if (typeof i !== "number") { + insert(i: number, text: string): void { + if (i > this.count) { return; } @@ -252,6 +266,35 @@ export class TextBuf { } } + /** + * Inserts text into the buffer at the specified position. + * + * @param `pos` Position at witch to insert the text + * @param `text` Text to insert + * + * @example + * + * ```ts + * import { assertEquals } from "jsr:@std/assert"; + * import { TextBuf } from "jsr:@eu-ge-ne/text-buf"; + * + * const buf = new TextBuf(); + * + * buf.insert2([0, 0], "Lorem"); + * buf.insert2([0, 5], " ipsum"); + * + * assertEquals(buf.read(0).toArray().join(""), "Lorem ipsum"); + * ``` + */ + insert2(pos: [number, number], text: string): void { + const i = this.#pos_to_index(pos); + if (typeof i !== "number") { + return; + } + + this.insert(i, text); + } + /** * Appends text to the buffer * @@ -303,10 +346,10 @@ export class TextBuf { } /** - * Removes characters in the buffer's section, specified by start (inclusive) and end (exclusive) positions. + * Removes characters in the buffer's section, specified by start (inclusive) and end (exclusive) indexes. * - * @param `start` Start position. - * @param `end` Optional end position. + * @param `start` Start index. + * @param `end` Optional end index. * * @example * @@ -321,88 +364,94 @@ export class TextBuf { * assertEquals(buf.read(0).toArray().join(""), "Lorem"); * ``` */ - delete(start: Pos, end?: Pos): void { - const i0 = this.#pos_to_index(start); - - if (typeof i0 === "number") { - const first = this.#find(i0); - - if (first) { - const i1 = (end ? this.#pos_to_index(end) : undefined) ?? - Number.MAX_SAFE_INTEGER; - - const { node, offset } = first; - const count = i1 - i0; - const offset2 = offset + count; - - if (offset2 === node.slice_len) { - if (offset === 0) { - this.#delete(node); - } else { - this.#trim_node_end(node, count); - bubble(node); - } - } else if (offset2 < node.slice_len) { - if (offset === 0) { - this.#trim_node_start(node, count); - bubble(node); - } else { - this.#split_node(node, offset, count); - } - } else { - let x = node; - let i = 0; + delete(start: number, end = Number.MAX_SAFE_INTEGER): void { + const first = this.#find(start); + if (!first) { + return; + } - if (offset !== 0) { - x = this.#split_node(node, offset, 0); - } + const { node, offset } = first; + const count = end - start; + const offset2 = offset + count; - const last = this.#find(i1); - if (last && last.offset !== 0) { - this.#split_node(last.node, last.offset, 0); - } + if (offset2 === node.slice_len) { + if (offset === 0) { + this.#delete(node); + } else { + this.#trim_node_end(node, count); + bubble(node); + } + } else if (offset2 < node.slice_len) { + if (offset === 0) { + this.#trim_node_start(node, count); + bubble(node); + } else { + this.#split_node(node, offset, count); + } + } else { + let x = node; + let i = 0; - while (!x.nil && (i < count)) { - i += x.slice_len; + if (offset !== 0) { + x = this.#split_node(node, offset, 0); + } - const next = successor(x); + const last = this.#find(end); + if (last && last.offset !== 0) { + this.#split_node(last.node, last.offset, 0); + } - this.#delete(x); + while (!x.nil && (i < count)) { + i += x.slice_len; - x = next; - } - } + const next = successor(x); + + this.#delete(x); + + x = next; } } } - #pos_to_index(pos: Pos): number | undefined { - let i: number | undefined; - - if (typeof pos === "number") { - i = pos; - } else { - let ln = pos[0]; - if (ln < 0) { - ln = Math.max(this.line_count + ln, 0); - } + /** + * Removes characters in the buffer's section, specified by start (inclusive) and end (exclusive) positions. + * + * @param `start` Start position. + * @param `end` Optional end position. + * + * @example + * + * ```ts + * import { assertEquals } from "jsr:@std/assert"; + * import { TextBuf } from "jsr:@eu-ge-ne/text-buf"; + * + * const buf = new TextBuf("Lorem ipsum"); + * + * buf.delete2([0, 5], [0, 11]); + * + * assertEquals(buf.read(0).toArray().join(""), "Lorem"); + * ``` + */ + delete2(start: [number, number], end?: [number, number]): void { + const i = this.#pos_to_index(start); + if (typeof i !== "number") { + return; + } - i = this.#find_line_start(ln); + this.delete(i, this.#pos_to_index(end)); + } - if (typeof i === "number") { - i += pos[1]; - } + #pos_to_index(pos?: [number, number]): number | undefined { + if (!pos) { + return; } - if (typeof i === "number") { - if (i < 0) { - i = Math.max(this.count + i, 0); - } - - if (i <= this.count) { - return i; - } + const i = this.#find_line_start(pos[0]); + if (typeof i !== "number") { + return; } + + return i + pos[1]; } #find(index: number): { node: Node; offset: number } | undefined { diff --git a/test/delete-from-line.test.ts b/test/delete-from-line.test.ts index 37eaf00..7af4dae 100644 --- a/test/delete-from-line.test.ts +++ b/test/delete-from-line.test.ts @@ -8,14 +8,14 @@ Deno.test("Delete from line", () => { assertEquals(buf.line_count, 5); - buf.delete([3, 0]); + buf.delete2([3, 0]); assert_generator(buf.read(0), "Lorem \nipsum \ndolor \n"); assertEquals(buf.count, 21); assertEquals(buf.line_count, 4); assert_tree(buf); - buf.delete([1, 0]); + buf.delete2([1, 0]); assert_generator(buf.read(0), "Lorem \n"); assertEquals(buf.count, 7); diff --git a/test/delete-line.test.ts b/test/delete-line.test.ts index 8a7bd78..11fc14a 100644 --- a/test/delete-line.test.ts +++ b/test/delete-line.test.ts @@ -8,28 +8,28 @@ Deno.test("Delete line", () => { assertEquals(buf.line_count, 5); - buf.delete([4, 0], [5, 0]); + buf.delete2([4, 0], [5, 0]); assert_generator(buf.read(0), "Lorem \nipsum \ndolor \nsit \n"); assertEquals(buf.count, 26); assertEquals(buf.line_count, 5); assert_tree(buf); - buf.delete([3, 0], [4, 0]); + buf.delete2([3, 0], [4, 0]); assert_generator(buf.read(0), "Lorem \nipsum \ndolor \n"); assertEquals(buf.count, 21); assertEquals(buf.line_count, 4); assert_tree(buf); - buf.delete([2, 0], [3, 0]); + buf.delete2([2, 0], [3, 0]); assert_generator(buf.read(0), "Lorem \nipsum \n"); assertEquals(buf.count, 14); assertEquals(buf.line_count, 3); assert_tree(buf); - buf.delete([1, 0], [2, 0]); + buf.delete2([1, 0], [2, 0]); assert_generator(buf.read(0), "Lorem \n"); assertEquals(buf.count, 7); diff --git a/test/delete.test.ts b/test/delete.test.ts index c0ec947..1bddb67 100644 --- a/test/delete.test.ts +++ b/test/delete.test.ts @@ -83,7 +83,7 @@ function test_delete_tail(buf: TextBuf, n: number): void { assertEquals(buf.count, expected.length); assert_tree(buf); - buf.delete(-n, buf.count); + buf.delete(Math.max(buf.count - n, 0), buf.count); expected = expected.slice(0, -n); } @@ -192,7 +192,7 @@ Deno.test("Delete removes lines", () => { assertEquals(buf.count, 5); assertEquals(buf.line_count, 1); assert_generator(buf.read(0), "ipsum"); - assert_generator(buf.read([0, 0], [1, 0]), "ipsum"); + assert_generator(buf.read2([0, 0], [1, 0]), "ipsum"); assert_tree(buf); }); diff --git a/test/insert-line.test.ts b/test/insert-line.test.ts index 116643f..0168d94 100644 --- a/test/insert-line.test.ts +++ b/test/insert-line.test.ts @@ -4,10 +4,10 @@ import { assert_generator, assert_tree } from "./assert.ts"; Deno.test("Insert into 0 line", () => { const buf = new TextBuf(); - buf.insert([0, 0], "Lorem ipsum"); + buf.insert2([0, 0], "Lorem ipsum"); assert_generator(buf.read(0), "Lorem ipsum"); - assert_generator(buf.read([0, 0], [1, 0]), "Lorem ipsum"); + assert_generator(buf.read2([0, 0], [1, 0]), "Lorem ipsum"); assert_tree(buf); }); @@ -16,10 +16,10 @@ Deno.test("Insert into a line", () => { const buf = new TextBuf(); buf.insert(0, "Lorem"); - buf.insert([0, 5], " ipsum"); + buf.insert2([0, 5], " ipsum"); assert_generator(buf.read(0), "Lorem ipsum"); - assert_generator(buf.read([0, 0], [1, 0]), "Lorem ipsum"); + assert_generator(buf.read2([0, 0], [1, 0]), "Lorem ipsum"); assert_tree(buf); }); @@ -27,10 +27,10 @@ Deno.test("Insert into a line", () => { Deno.test("Insert into a line which does not exist", () => { const buf = new TextBuf(); - buf.insert([1, 0], "Lorem ipsum"); + buf.insert2([1, 0], "Lorem ipsum"); assert_generator(buf.read(0), ""); - assert_generator(buf.read([0, 0], [1, 0]), ""); + assert_generator(buf.read2([0, 0], [1, 0]), ""); assert_tree(buf); }); @@ -38,10 +38,10 @@ Deno.test("Insert into a line which does not exist", () => { Deno.test("Insert into a column which does not exist", () => { const buf = new TextBuf(); - buf.insert([0, 1], "Lorem ipsum"); + buf.insert2([0, 1], "Lorem ipsum"); assert_generator(buf.read(0), ""); - assert_generator(buf.read([0, 0], [1, 0]), ""); + assert_generator(buf.read2([0, 0], [1, 0]), ""); assert_tree(buf); }); diff --git a/test/read-from-line.test.ts b/test/read-from-line.test.ts index 91c005f..9d10e93 100644 --- a/test/read-from-line.test.ts +++ b/test/read-from-line.test.ts @@ -4,11 +4,11 @@ import { assert_generator, assert_tree } from "./assert.ts"; Deno.test("Line at valid index", () => { const buf = new TextBuf("Lorem\nipsum\ndolor\nsit\namet"); - assert_generator(buf.read([0, 0]), "Lorem\nipsum\ndolor\nsit\namet"); - assert_generator(buf.read([1, 0]), "ipsum\ndolor\nsit\namet"); - assert_generator(buf.read([2, 0]), "dolor\nsit\namet"); - assert_generator(buf.read([3, 0]), "sit\namet"); - assert_generator(buf.read([4, 0]), "amet"); + assert_generator(buf.read2([0, 0]), "Lorem\nipsum\ndolor\nsit\namet"); + assert_generator(buf.read2([1, 0]), "ipsum\ndolor\nsit\namet"); + assert_generator(buf.read2([2, 0]), "dolor\nsit\namet"); + assert_generator(buf.read2([3, 0]), "sit\namet"); + assert_generator(buf.read2([4, 0]), "amet"); assert_tree(buf); }); @@ -16,9 +16,9 @@ Deno.test("Line at valid index", () => { Deno.test("Line at index >= line_count", () => { const buf = new TextBuf("Lorem\nipsum\ndolor\nsit\namet"); - assert_generator(buf.read([4, 0]), "amet"); - assert_generator(buf.read([5, 0]), ""); - assert_generator(buf.read([6, 0]), ""); + assert_generator(buf.read2([4, 0]), "amet"); + assert_generator(buf.read2([5, 0]), ""); + assert_generator(buf.read2([6, 0]), ""); assert_tree(buf); }); @@ -26,9 +26,9 @@ Deno.test("Line at index >= line_count", () => { Deno.test("Line at index < 0", () => { const buf = new TextBuf("Lorem\nipsum\ndolor\nsit\namet"); - assert_generator(buf.read([0, 0]), "Lorem\nipsum\ndolor\nsit\namet"); - assert_generator(buf.read([-1, 0]), "amet"); - assert_generator(buf.read([-2, 0]), "sit\namet"); + assert_generator(buf.read2([0, 0]), "Lorem\nipsum\ndolor\nsit\namet"); + assert_generator(buf.read2([buf.line_count - 1, 0]), "amet"); + assert_generator(buf.read2([buf.line_count - 2, 0]), "sit\namet"); assert_tree(buf); }); diff --git a/test/read-line.test.ts b/test/read-line.test.ts index e07120a..2288001 100644 --- a/test/read-line.test.ts +++ b/test/read-line.test.ts @@ -7,7 +7,7 @@ Deno.test("Empty", () => { const buf = new TextBuf(); assertEquals(buf.line_count, 0); - assert_generator(buf.read([0, 0], [1, 0]), ""); + assert_generator(buf.read2([0, 0], [1, 0]), ""); assert_tree(buf); }); @@ -16,7 +16,7 @@ Deno.test("1 line", () => { const buf = new TextBuf("0"); assertEquals(buf.line_count, 1); - assert_generator(buf.read([0, 0], [1, 0]), "0"); + assert_generator(buf.read2([0, 0], [1, 0]), "0"); assert_tree(buf); }); @@ -25,8 +25,8 @@ Deno.test("2 lines", () => { const buf = new TextBuf("0\n"); assertEquals(buf.line_count, 2); - assert_generator(buf.read([0, 0], [1, 0]), "0\n"); - assert_generator(buf.read([1, 0], [2, 0]), ""); + assert_generator(buf.read2([0, 0], [1, 0]), "0\n"); + assert_generator(buf.read2([1, 0], [2, 0]), ""); assert_tree(buf); }); @@ -35,9 +35,9 @@ Deno.test("3 lines", () => { const buf = new TextBuf("0\n1\n"); assertEquals(buf.line_count, 3); - assert_generator(buf.read([0, 0], [1, 0]), "0\n"); - assert_generator(buf.read([1, 0], [2, 0]), "1\n"); - assert_generator(buf.read([2, 0], [3, 0]), ""); + assert_generator(buf.read2([0, 0], [1, 0]), "0\n"); + assert_generator(buf.read2([1, 0], [2, 0]), "1\n"); + assert_generator(buf.read2([2, 0], [3, 0]), ""); assert_tree(buf); }); @@ -56,25 +56,25 @@ Deno.test("Line at valid index", () => { buf.insert(57, "sed\neiusmod\n"); buf.insert(61, "do\n"); - assert_generator(buf.read([0, 0], [1, 0]), "Lorem\n"); - assert_generator(buf.read([1, 0], [2, 0]), "ipsum\n"); - assert_generator(buf.read([2, 0], [3, 0]), "dolor\n"); - assert_generator(buf.read([3, 0], [4, 0]), "sit\n"); - assert_generator(buf.read([4, 0], [5, 0]), "amet,\n"); - assert_generator(buf.read([5, 0], [6, 0]), "consectetur\n"); - assert_generator(buf.read([6, 0], [7, 0]), "adipiscing\n"); - assert_generator(buf.read([7, 0], [8, 0]), "elit,\n"); - assert_generator(buf.read([8, 0], [9, 0]), "sed\n"); - assert_generator(buf.read([9, 0], [10, 0]), "do\n"); - assert_generator(buf.read([10, 0], [11, 0]), "eiusmod\n"); - assert_generator(buf.read([11, 0], [12, 0]), "tempor\n"); - assert_generator(buf.read([12, 0], [13, 0]), "incididunt\n"); - assert_generator(buf.read([13, 0], [14, 0]), "ut\n"); - assert_generator(buf.read([14, 0], [15, 0]), "labore\n"); - assert_generator(buf.read([15, 0], [16, 0]), "et\n"); - assert_generator(buf.read([16, 0], [17, 0]), "dolore\n"); - assert_generator(buf.read([17, 0], [18, 0]), "magna\n"); - assert_generator(buf.read([18, 0], [19, 0]), "aliqua."); + assert_generator(buf.read2([0, 0], [1, 0]), "Lorem\n"); + assert_generator(buf.read2([1, 0], [2, 0]), "ipsum\n"); + assert_generator(buf.read2([2, 0], [3, 0]), "dolor\n"); + assert_generator(buf.read2([3, 0], [4, 0]), "sit\n"); + assert_generator(buf.read2([4, 0], [5, 0]), "amet,\n"); + assert_generator(buf.read2([5, 0], [6, 0]), "consectetur\n"); + assert_generator(buf.read2([6, 0], [7, 0]), "adipiscing\n"); + assert_generator(buf.read2([7, 0], [8, 0]), "elit,\n"); + assert_generator(buf.read2([8, 0], [9, 0]), "sed\n"); + assert_generator(buf.read2([9, 0], [10, 0]), "do\n"); + assert_generator(buf.read2([10, 0], [11, 0]), "eiusmod\n"); + assert_generator(buf.read2([11, 0], [12, 0]), "tempor\n"); + assert_generator(buf.read2([12, 0], [13, 0]), "incididunt\n"); + assert_generator(buf.read2([13, 0], [14, 0]), "ut\n"); + assert_generator(buf.read2([14, 0], [15, 0]), "labore\n"); + assert_generator(buf.read2([15, 0], [16, 0]), "et\n"); + assert_generator(buf.read2([16, 0], [17, 0]), "dolore\n"); + assert_generator(buf.read2([17, 0], [18, 0]), "magna\n"); + assert_generator(buf.read2([18, 0], [19, 0]), "aliqua."); assert_tree(buf); }); @@ -82,9 +82,9 @@ Deno.test("Line at valid index", () => { Deno.test("Line at index >= line_count", () => { const buf = new TextBuf("Lorem\nipsum\ndolor\nsit\namet"); - assert_generator(buf.read([4, 0], [5, 0]), "amet"); - assert_generator(buf.read([5, 0], [6, 0]), ""); - assert_generator(buf.read([6, 0], [7, 0]), ""); + assert_generator(buf.read2([4, 0], [5, 0]), "amet"); + assert_generator(buf.read2([5, 0], [6, 0]), ""); + assert_generator(buf.read2([6, 0], [7, 0]), ""); assert_tree(buf); }); @@ -92,9 +92,15 @@ Deno.test("Line at index >= line_count", () => { Deno.test("Line at index < 0", () => { const buf = new TextBuf("Lorem\nipsum\ndolor\nsit\namet"); - assert_generator(buf.read([0, 0], [1, 0]), "Lorem\n"); - assert_generator(buf.read([-1, 0], [buf.line_count, 0]), "amet"); - assert_generator(buf.read([-2, 0], [-1, 0]), "sit\n"); + assert_generator(buf.read2([0, 0], [1, 0]), "Lorem\n"); + assert_generator( + buf.read2([buf.line_count - 1, 0], [buf.line_count, 0]), + "amet", + ); + assert_generator( + buf.read2([buf.line_count - 2, 0], [buf.line_count - 1, 0]), + "sit\n", + ); assert_tree(buf); }); @@ -106,11 +112,11 @@ Deno.test("Insert adds lines", () => { buf.insert(buf.count, `${i}\n`); assertEquals(buf.line_count, i + 2); - assert_generator(buf.read([i, 0], [i + 1, 0]), `${i}\n`); + assert_generator(buf.read2([i, 0], [i + 1, 0]), `${i}\n`); assert_tree(buf); } assertEquals(buf.line_count, 11); - assert_generator(buf.read([11, 0], [12, 0]), ""); + assert_generator(buf.read2([11, 0], [12, 0]), ""); assert_tree(buf); }); diff --git a/test/read.test.ts b/test/read.test.ts index c67522b..1b778ff 100644 --- a/test/read.test.ts +++ b/test/read.test.ts @@ -29,8 +29,8 @@ Deno.test("Read at start < 0", () => { const buf = new TextBuf("Lorem"); assert_generator(buf.read(0), "Lorem"); - assert_generator(buf.read(-1), "m"); - assert_generator(buf.read(-2), "em"); + assert_generator(buf.read(buf.count - 1), "m"); + assert_generator(buf.read(buf.count - 2), "em"); assert_tree(buf); });