@jamashita/lluvia-sequence 2.5.0 → 2.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/dist/cjs/ASequence.d.ts +9 -8
  2. package/dist/cjs/ASequence.d.ts.map +1 -1
  3. package/dist/cjs/ASequence.js +39 -50
  4. package/dist/cjs/ASequence.js.map +1 -1
  5. package/dist/cjs/ImmutableSequence.d.ts +4 -5
  6. package/dist/cjs/ImmutableSequence.d.ts.map +1 -1
  7. package/dist/cjs/ImmutableSequence.js +0 -1
  8. package/dist/cjs/ImmutableSequence.js.map +1 -1
  9. package/dist/cjs/MutableSequence.d.ts +7 -8
  10. package/dist/cjs/MutableSequence.d.ts.map +1 -1
  11. package/dist/cjs/MutableSequence.js +3 -4
  12. package/dist/cjs/MutableSequence.js.map +1 -1
  13. package/dist/cjs/ReadonlySequence.d.ts +2 -1
  14. package/dist/cjs/ReadonlySequence.d.ts.map +1 -1
  15. package/dist/cjs/Sequence.d.ts +1 -1
  16. package/dist/cjs/Sequence.d.ts.map +1 -1
  17. package/dist/cjs/index.d.ts +1 -1
  18. package/dist/cjs/index.js +6 -2
  19. package/dist/cjs/index.js.map +1 -1
  20. package/dist/cjs/{Mock → mock}/MockSequence.d.ts +1 -2
  21. package/dist/cjs/mock/MockSequence.d.ts.map +1 -0
  22. package/dist/cjs/{Mock → mock}/MockSequence.js +0 -1
  23. package/dist/cjs/mock/MockSequence.js.map +1 -0
  24. package/dist/esm/ASequence.d.ts +9 -8
  25. package/dist/esm/ASequence.d.ts.map +1 -1
  26. package/dist/esm/ASequence.js +39 -50
  27. package/dist/esm/ASequence.js.map +1 -1
  28. package/dist/esm/ImmutableSequence.d.ts +4 -5
  29. package/dist/esm/ImmutableSequence.d.ts.map +1 -1
  30. package/dist/esm/ImmutableSequence.js +0 -1
  31. package/dist/esm/ImmutableSequence.js.map +1 -1
  32. package/dist/esm/MutableSequence.d.ts +7 -8
  33. package/dist/esm/MutableSequence.d.ts.map +1 -1
  34. package/dist/esm/MutableSequence.js +3 -4
  35. package/dist/esm/MutableSequence.js.map +1 -1
  36. package/dist/esm/ReadonlySequence.d.ts +2 -1
  37. package/dist/esm/ReadonlySequence.d.ts.map +1 -1
  38. package/dist/esm/Sequence.d.ts +1 -1
  39. package/dist/esm/Sequence.d.ts.map +1 -1
  40. package/dist/esm/index.d.ts +1 -1
  41. package/dist/esm/index.js +1 -1
  42. package/dist/esm/{Mock → mock}/MockSequence.d.ts +1 -2
  43. package/dist/esm/mock/MockSequence.d.ts.map +1 -0
  44. package/dist/esm/{Mock → mock}/MockSequence.js +0 -1
  45. package/dist/esm/mock/MockSequence.js.map +1 -0
  46. package/dist/tsconfig.cjs.tsbuildinfo +1 -1
  47. package/dist/tsconfig.esm.tsbuildinfo +1 -1
  48. package/package.json +6 -8
  49. package/src/ASequence.ts +53 -67
  50. package/src/ImmutableSequence.ts +19 -21
  51. package/src/MutableSequence.ts +16 -18
  52. package/src/ReadonlySequence.ts +3 -1
  53. package/src/Sequence.ts +1 -1
  54. package/src/__tests__/ASequence.spec.ts +227 -229
  55. package/src/__tests__/ImmutableSequence.spec.ts +231 -285
  56. package/src/__tests__/MutableSequence.spec.ts +210 -260
  57. package/src/index.ts +1 -1
  58. package/src/{Mock → mock}/MockSequence.ts +1 -3
  59. package/dist/cjs/Mock/MockSequence.d.ts.map +0 -1
  60. package/dist/cjs/Mock/MockSequence.js.map +0 -1
  61. package/dist/esm/Mock/MockSequence.d.ts.map +0 -1
  62. package/dist/esm/Mock/MockSequence.js.map +0 -1
package/src/ASequence.ts CHANGED
@@ -12,7 +12,7 @@ import {
12
12
  import { Quantity } from '@jamashita/lluvia-collection';
13
13
  import { Sequence } from './Sequence';
14
14
 
15
- export abstract class ASequence<V, T extends ASequence<V, T>, N extends string = string> extends Quantity<number, V, N> implements Sequence<V, N> {
15
+ export abstract class ASequence<V, T extends ASequence<V, T>> extends Quantity<number, V> implements Sequence<V> {
16
16
  protected sequence: Array<V>;
17
17
 
18
18
  protected constructor(sequence: Array<V>) {
@@ -20,17 +20,17 @@ export abstract class ASequence<V, T extends ASequence<V, T>, N extends string =
20
20
  this.sequence = sequence;
21
21
  }
22
22
 
23
- public abstract add(value: V): Sequence<V, N>;
24
-
25
- public abstract set(key: number, value: V): T;
26
-
27
- public abstract remove(key: number): T;
23
+ public abstract add(value: V): Sequence<V>;
28
24
 
29
25
  public abstract duplicate(): T;
30
26
 
27
+ public abstract override filter(predicate: BinaryPredicate<V, number>): T;
28
+
31
29
  public abstract override map<W>(mapper: Mapper<V, W>): Sequence<W>;
32
30
 
33
- public abstract override filter(predicate: BinaryPredicate<V, number>): T;
31
+ public abstract remove(key: number): T;
32
+
33
+ public abstract set(key: number, value: V): T;
34
34
 
35
35
  public abstract sort(comparator: BinaryFunction<V, V, number>): T;
36
36
 
@@ -60,38 +60,32 @@ export abstract class ASequence<V, T extends ASequence<V, T>, N extends string =
60
60
  return false;
61
61
  }
62
62
 
63
- const ti: Iterator<V> = this.values()[Symbol.iterator]();
64
- const oi: Iterator<unknown> = other.values()[Symbol.iterator]();
65
- let tr: IteratorResult<V> = ti.next();
66
- let or: IteratorResult<unknown> = oi.next();
67
-
68
- while (tr.done !== true && or.done !== true) {
69
- if (isEqualable(tr.value) && isEqualable(or.value)) {
70
- if (!tr.value.equals(or.value)) {
71
- return false;
72
- }
73
- }
74
- else if (tr.value !== or.value) {
75
- return false;
76
- }
77
-
78
- tr = ti.next();
79
- or = oi.next();
80
-
81
- if (tr.done === true && or.done === true) {
63
+ return this.sequence.every((v: V, i: number) => {
64
+ if (v === other.sequence[i]) {
82
65
  return true;
83
66
  }
84
- }
67
+ if (isEqualable(v)) {
68
+ return v.equals(other.sequence[i]);
69
+ }
85
70
 
86
- return false;
71
+ return false;
72
+ });
87
73
  }
88
74
 
89
75
  public every(predicate: BinaryPredicate<V, number>): boolean {
90
- const found: Ambiguous<V> = this.sequence.find((v: V, i: number) => {
91
- return !predicate(v, i);
76
+ return this.sequence.every(predicate);
77
+ }
78
+
79
+ protected filterInternal(predicate: BinaryPredicate<V, number>): Array<V> {
80
+ const arr: Array<V> = [];
81
+
82
+ this.sequence.forEach((v: V, i: number) => {
83
+ if (predicate(v, i)) {
84
+ arr.push(v);
85
+ }
92
86
  });
93
87
 
94
- return Kind.isUndefined(found);
88
+ return arr;
95
89
  }
96
90
 
97
91
  public find(predicate: BinaryPredicate<V, number>): Nullable<V> {
@@ -105,9 +99,7 @@ export abstract class ASequence<V, T extends ASequence<V, T>, N extends string =
105
99
  }
106
100
 
107
101
  public forEach(catalogue: Catalogue<number, V>): void {
108
- this.sequence.forEach((v: V, i: number) => {
109
- catalogue(v, i);
110
- });
102
+ this.sequence.forEach(catalogue);
111
103
  }
112
104
 
113
105
  public get(key: number): Nullable<V> {
@@ -126,40 +118,12 @@ export abstract class ASequence<V, T extends ASequence<V, T>, N extends string =
126
118
  }).values();
127
119
  }
128
120
 
129
- public serialize(): string {
130
- return this.sequence.map<string>((v: V) => {
131
- return Objet.identify(v);
132
- }).join(', ');
133
- }
134
-
135
- public size(): number {
136
- return this.sequence.length;
137
- }
138
-
139
- public some(predicate: BinaryPredicate<V, number>): boolean {
140
- const found: Ambiguous<V> = this.sequence.find(predicate);
141
-
142
- return !Kind.isUndefined(found);
143
- }
144
-
145
- public toArray(): Array<V> {
146
- return [...this.sequence];
147
- }
148
-
149
- public values(): Iterable<V> {
150
- return this.toArray();
151
- }
152
-
153
- protected filterInternal(predicate: BinaryPredicate<V, number>): Array<V> {
154
- const arr: Array<V> = [];
155
-
156
- this.sequence.forEach((v: V, i: number) => {
157
- if (predicate(v, i)) {
158
- arr.push(v);
159
- }
160
- });
121
+ public reduce(reducer: BinaryFunction<V, V, V>, initialValue?: V): V {
122
+ if (Kind.isUndefined(initialValue)) {
123
+ return this.sequence.reduce(reducer);
124
+ }
161
125
 
162
- return arr;
126
+ return this.sequence.reduce(reducer, initialValue);
163
127
  }
164
128
 
165
129
  protected removeInternal(key: number): Array<V> {
@@ -173,6 +137,12 @@ export abstract class ASequence<V, T extends ASequence<V, T>, N extends string =
173
137
  return [...this.sequence.slice(0, key), ...this.sequence.slice(key + 1)];
174
138
  }
175
139
 
140
+ public serialize(): string {
141
+ return this.sequence.map<string>((v: V) => {
142
+ return Objet.identify(v);
143
+ }).join(', ');
144
+ }
145
+
176
146
  protected setInternal(key: number, value: V): Array<V> {
177
147
  if (!Kind.isInteger(key)) {
178
148
  return this.sequence;
@@ -183,4 +153,20 @@ export abstract class ASequence<V, T extends ASequence<V, T>, N extends string =
183
153
 
184
154
  return [...this.sequence.slice(0, key), value, ...this.sequence.slice(key + 1)];
185
155
  }
156
+
157
+ public size(): number {
158
+ return this.sequence.length;
159
+ }
160
+
161
+ public some(predicate: BinaryPredicate<V, number>): boolean {
162
+ return this.sequence.some(predicate);
163
+ }
164
+
165
+ public toArray(): Array<V> {
166
+ return [...this.sequence];
167
+ }
168
+
169
+ public values(): Iterable<V> {
170
+ return this.toArray();
171
+ }
186
172
  }
@@ -2,29 +2,27 @@ import { BinaryFunction, BinaryPredicate, Mapper } from '@jamashita/anden-type';
2
2
  import { Collection } from '@jamashita/lluvia-collection';
3
3
  import { ASequence } from './ASequence';
4
4
 
5
- export class ImmutableSequence<V> extends ASequence<V, ImmutableSequence<V>, 'ImmutableSequence'> {
6
- public readonly noun: 'ImmutableSequence' = 'ImmutableSequence';
7
-
5
+ export class ImmutableSequence<V> extends ASequence<V, ImmutableSequence<V>> {
8
6
  private static readonly EMPTY: ImmutableSequence<unknown> = new ImmutableSequence<unknown>([]);
9
7
 
10
- public static empty<VT>(): ImmutableSequence<VT> {
11
- return ImmutableSequence.EMPTY as ImmutableSequence<VT>;
8
+ public static empty<V>(): ImmutableSequence<V> {
9
+ return ImmutableSequence.EMPTY as ImmutableSequence<V>;
12
10
  }
13
11
 
14
- public static of<VT>(collection: Collection<number, VT>): ImmutableSequence<VT> {
15
- return ImmutableSequence.ofInternal<VT>([...collection.values()]);
12
+ public static of<V>(collection: Collection<number, V>): ImmutableSequence<V> {
13
+ return ImmutableSequence.ofInternal([...collection.values()]);
16
14
  }
17
15
 
18
- public static ofArray<VT>(array: ReadonlyArray<VT>): ImmutableSequence<VT> {
19
- return ImmutableSequence.ofInternal<VT>([...array]);
16
+ public static ofArray<V>(array: ReadonlyArray<V>): ImmutableSequence<V> {
17
+ return ImmutableSequence.ofInternal([...array]);
20
18
  }
21
19
 
22
- private static ofInternal<VT>(array: Array<VT>): ImmutableSequence<VT> {
20
+ private static ofInternal<V>(array: Array<V>): ImmutableSequence<V> {
23
21
  if (array.length === 0) {
24
- return ImmutableSequence.empty<VT>();
22
+ return ImmutableSequence.empty();
25
23
  }
26
24
 
27
- return new ImmutableSequence<VT>(array);
25
+ return new ImmutableSequence(array);
28
26
  }
29
27
 
30
28
  protected constructor(sequence: Array<V>) {
@@ -32,23 +30,23 @@ export class ImmutableSequence<V> extends ASequence<V, ImmutableSequence<V>, 'Im
32
30
  }
33
31
 
34
32
  public add(value: V): ImmutableSequence<V> {
35
- return ImmutableSequence.ofArray<V>([...this.sequence, value]);
33
+ return ImmutableSequence.ofArray([...this.sequence, value]);
36
34
  }
37
35
 
38
36
  public duplicate(): ImmutableSequence<V> {
39
37
  if (this.isEmpty()) {
40
- return ImmutableSequence.empty<V>();
38
+ return ImmutableSequence.empty();
41
39
  }
42
40
 
43
- return ImmutableSequence.ofArray<V>([...this.sequence]);
41
+ return ImmutableSequence.ofArray([...this.sequence]);
44
42
  }
45
43
 
46
44
  public filter(predicate: BinaryPredicate<V, number>): ImmutableSequence<V> {
47
- return ImmutableSequence.ofArray<V>(this.filterInternal(predicate));
45
+ return ImmutableSequence.ofArray(this.filterInternal(predicate));
48
46
  }
49
47
 
50
48
  public override isEmpty(): boolean {
51
- if (this === ImmutableSequence.empty<V>()) {
49
+ if (this === ImmutableSequence.empty()) {
52
50
  return true;
53
51
  }
54
52
 
@@ -56,7 +54,7 @@ export class ImmutableSequence<V> extends ASequence<V, ImmutableSequence<V>, 'Im
56
54
  }
57
55
 
58
56
  public map<W>(mapper: Mapper<V, W>): ImmutableSequence<W> {
59
- return ImmutableSequence.ofArray<W>(this.sequence.map<W>(mapper));
57
+ return ImmutableSequence.ofArray(this.sequence.map(mapper));
60
58
  }
61
59
 
62
60
  public remove(key: number): ImmutableSequence<V> {
@@ -66,7 +64,7 @@ export class ImmutableSequence<V> extends ASequence<V, ImmutableSequence<V>, 'Im
66
64
  return this;
67
65
  }
68
66
 
69
- return ImmutableSequence.ofArray<V>(sequence);
67
+ return ImmutableSequence.ofArray(sequence);
70
68
  }
71
69
 
72
70
  public set(key: number, value: V): ImmutableSequence<V> {
@@ -76,7 +74,7 @@ export class ImmutableSequence<V> extends ASequence<V, ImmutableSequence<V>, 'Im
76
74
  return this;
77
75
  }
78
76
 
79
- return ImmutableSequence.ofArray<V>(sequence);
77
+ return ImmutableSequence.ofArray(sequence);
80
78
  }
81
79
 
82
80
  public sort(comparator: BinaryFunction<V, V, number>): ImmutableSequence<V> {
@@ -84,6 +82,6 @@ export class ImmutableSequence<V> extends ASequence<V, ImmutableSequence<V>, 'Im
84
82
 
85
83
  arr.sort(comparator);
86
84
 
87
- return ImmutableSequence.ofArray<V>(arr);
85
+ return ImmutableSequence.ofArray(arr);
88
86
  }
89
87
  }
@@ -2,54 +2,52 @@ import { BinaryFunction, BinaryPredicate, Mapper } from '@jamashita/anden-type';
2
2
  import { Collection } from '@jamashita/lluvia-collection';
3
3
  import { ASequence } from './ASequence';
4
4
 
5
- export class MutableSequence<V> extends ASequence<V, MutableSequence<V>, 'MutableSequence'> {
6
- public readonly noun: 'MutableSequence' = 'MutableSequence';
7
-
8
- public static empty<VT>(): MutableSequence<VT> {
9
- return MutableSequence.ofArray<VT>([]);
5
+ export class MutableSequence<V> extends ASequence<V, MutableSequence<V>> {
6
+ public static empty<V>(): MutableSequence<V> {
7
+ return MutableSequence.ofArray([]);
10
8
  }
11
9
 
12
- public static of<VT>(collection: Collection<number, VT>): MutableSequence<VT> {
13
- return MutableSequence.ofInternal<VT>([...collection.values()]);
10
+ public static of<V>(collection: Collection<number, V>): MutableSequence<V> {
11
+ return MutableSequence.ofInternal([...collection.values()]);
14
12
  }
15
13
 
16
- public static ofArray<VT>(array: ReadonlyArray<VT>): MutableSequence<VT> {
17
- return MutableSequence.ofInternal<VT>([...array]);
14
+ public static ofArray<V>(array: ReadonlyArray<V>): MutableSequence<V> {
15
+ return MutableSequence.ofInternal([...array]);
18
16
  }
19
17
 
20
- private static ofInternal<VT>(array: Array<VT>): MutableSequence<VT> {
21
- return new MutableSequence<VT>(array);
18
+ private static ofInternal<V>(array: Array<V>): MutableSequence<V> {
19
+ return new MutableSequence(array);
22
20
  }
23
21
 
24
22
  protected constructor(sequence: Array<V>) {
25
23
  super(sequence);
26
24
  }
27
25
 
28
- public add(value: V): MutableSequence<V> {
26
+ public add(value: V): this {
29
27
  this.sequence.push(value);
30
28
 
31
29
  return this;
32
30
  }
33
31
 
34
32
  public duplicate(): MutableSequence<V> {
35
- return MutableSequence.ofArray<V>([...this.sequence]);
33
+ return MutableSequence.ofArray([...this.sequence]);
36
34
  }
37
35
 
38
36
  public filter(predicate: BinaryPredicate<V, number>): MutableSequence<V> {
39
- return MutableSequence.ofArray<V>(this.filterInternal(predicate));
37
+ return MutableSequence.ofArray(this.filterInternal(predicate));
40
38
  }
41
39
 
42
40
  public map<W>(mapper: Mapper<V, W>): MutableSequence<W> {
43
- return MutableSequence.ofArray<W>(this.sequence.map<W>(mapper));
41
+ return MutableSequence.ofArray(this.sequence.map(mapper));
44
42
  }
45
43
 
46
- public remove(key: number): MutableSequence<V> {
44
+ public remove(key: number): this {
47
45
  this.sequence = this.removeInternal(key);
48
46
 
49
47
  return this;
50
48
  }
51
49
 
52
- public set(key: number, value: V): MutableSequence<V> {
50
+ public set(key: number, value: V): this {
53
51
  this.sequence = this.setInternal(key, value);
54
52
 
55
53
  return this;
@@ -60,6 +58,6 @@ export class MutableSequence<V> extends ASequence<V, MutableSequence<V>, 'Mutabl
60
58
 
61
59
  arr.sort(comparator);
62
60
 
63
- return MutableSequence.ofArray<V>(arr);
61
+ return MutableSequence.ofArray(arr);
64
62
  }
65
63
  }
@@ -1,13 +1,15 @@
1
1
  import { BinaryFunction, BinaryPredicate, Cloneable, Mapper } from '@jamashita/anden-type';
2
2
  import { Collection } from '@jamashita/lluvia-collection';
3
3
 
4
- export interface ReadonlySequence<V, N extends string = string> extends Collection<number, V, N>, Cloneable<ReadonlySequence<V>> {
4
+ export interface ReadonlySequence<V> extends Collection<number, V>, Cloneable<ReadonlySequence<V>> {
5
5
  filter(predicate: BinaryPredicate<V, number>): ReadonlySequence<V>;
6
6
 
7
7
  iterator(): IterableIterator<[number, V]>;
8
8
 
9
9
  map<W>(mapper: Mapper<V, W>): ReadonlySequence<W>;
10
10
 
11
+ reduce(reducer: BinaryFunction<V, V, V>, initialValue?: V): V;
12
+
11
13
  sort(comparator: BinaryFunction<V, V, number>): ReadonlySequence<V>;
12
14
 
13
15
  toArray(): Array<V>;
package/src/Sequence.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { BinaryPredicate, Mapper } from '@jamashita/anden-type';
2
2
  import { ReadonlySequence } from './ReadonlySequence';
3
3
 
4
- export interface Sequence<V, N extends string = string> extends ReadonlySequence<V, N> {
4
+ export interface Sequence<V> extends ReadonlySequence<V> {
5
5
  add(value: V): Sequence<V>;
6
6
 
7
7
  filter(predicate: BinaryPredicate<V, number>): Sequence<V>;