-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathends-with.ts
84 lines (74 loc) · 2.63 KB
/
ends-with.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import type { PrototypeStruct } from '../index.js';
interface EndsWith<T> {
endsWith(needle: T[]): boolean;
}
export const endsWith: PrototypeStruct = {
label: 'endsWith',
fn: function arrayEndsWith<T>(needle: T[]): boolean {
const ctx = this as unknown as T[];
if (!Array.isArray(needle)) {
throw new TypeError(`Expect 'needle' to be an array`);
}
const ctxLen = ctx.length;
const len = needle.length;
if (!len) return true;
if (!ctxLen || ctxLen < len) return false;
// offset_for_a_index = a.length - b.length
//
// a = [1, 1, 2, 3, 4]
// b = [4]
// offset = a.length - b.length = 5 - 1 = 4 #
// loop if i = 0; i < b.length; i++
// i: 0; b[i] = b[0] = 4; a[i + offset] = a[0 + 4] = a[4] = 4
//
// a = [1, 1, 2, 3, 4]
// b = [3, 4]
// offset = a.length - b.length = 5 - 2 = 3 #
// loop if i = 0; i < b.length; i++
// i: 0; b[i] = b[0] = 3; a[i + offset] = a[0 + 3] = a[3] = 3
// i: 1; b[i] = b[1] = 4; a[i + offset] = a[1 + 3] = a[3] = 4
//
// a = [1, 1, 2, 3, 4]
// b = [2, 3, 4]
// offset = a.length - b.length = 5 - 3 = 2 #
// loop if i = 0; i < b.length; i++
// i: 0; b[i] = b[0] = 2; a[i + offset] = a[0 + 2] = a[2] = 2
// i: 1; b[i] = b[1] = 3; a[i + offset] = a[1 + 2] = a[3] = 3
// i: 2; b[i] = b[2] = 4; a[i + offset] = a[2 + 2] = a[4] = 4
//
// a = [1, 1, 2, 3, 4]
// b = [1, 2, 3, 4]
// offset = a.length - b.length = 5 - 4 = 1 #
// loop if i = 0; i < b.length; i++
// i: 0; b[i] = b[0] = 1; a[i + offset] = a[0 + 1] = a[1] = 1
// i: 1; b[i] = b[1] = 2; a[i + offset] = a[1 + 1] = a[2] = 2
// i: 2; b[i] = b[2] = 3; a[i + offset] = a[2 + 1] = a[3] = 3
// i: 3; b[i] = b[3] = 4; a[i + offset] = a[3 + 1] = a[4] = 4
//
// a = [1, 1, 2, 3, 4]
// b = [1, 1, 2, 3, 4]
// offset = a.length - b.length = 5 - 5 = 0 #
// loop if i = 0; i < b.length; i++
// i: 0; b[i] = b[0] = 1; a[i + offset] = a[0 + 0] = a[0] = 1
// i: 1; b[i] = b[1] = 1; a[i + offset] = a[1 + 0] = a[1] = 1
// i: 2; b[i] = b[2] = 2; a[i + offset] = a[2 + 0] = a[2] = 2
// i: 3; b[i] = b[3] = 3; a[i + offset] = a[3 + 0] = a[3] = 3
// i: 4; b[i] = b[4] = 4; a[i + offset] = a[4 + 0] = a[4] = 4
const offsetIndex = ctxLen - len;
// A B OR AND
// 0 0 0 0
// 0 1 1 0
// 1 0 1 0
// 1 1 1 1
let matched = 1;
for (let i = 0; i < len; i += 1) {
const val = needle[i];
// tslint:disable-next-line: no-bitwise
matched &= Number(val === ctx[i + offsetIndex]);
}
return Boolean(matched);
},
};
declare global {
interface Array<T> extends EndsWith<T> {}
}