@wszerad/items 0.2.0 → 0.3.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.
package/dist/index.d.mts CHANGED
@@ -1,28 +1,36 @@
1
1
  //#region src/select.d.ts
2
-
3
- declare class BaseSelect<E> {
4
- ids: ItemId[];
5
- self: Items<E>;
6
- constructor(ids: ItemId[], self: Items<E>);
2
+ declare class BaseSelect<E, SE> {
3
+ items: E[];
4
+ context: Map<SE, E>;
5
+ constructor(items: E[], context?: Map<SE, E>);
6
+ private cleanContext;
7
7
  }
8
- declare class SingleSelect<E> extends BaseSelect<E> {}
9
- declare class Select<E> extends BaseSelect<E> {
10
- take(len: number): Select<E>;
11
- skip(len: number): Select<E>;
12
- filter(testFn: (entry: E, id: ItemId, index: number) => boolean): Select<E>;
13
- revert(): Select<E>;
14
- sort(sortFn: (x: E, y: E) => number): Select<E>;
15
- at(index: number): SingleSelect<E>;
16
- from(entities: Iterable<E>): Select<E>;
17
- on(entry: E): SingleSelect<E>;
8
+ declare class SingleSelect<E, SE> extends BaseSelect<E, SE> {}
9
+ declare class Select<E, SE> extends BaseSelect<E, SE> {
10
+ take(len: number): Select<E, SE>;
11
+ skip(len: number): Select<E, SE>;
12
+ filter(testFn: TestFn<E>): Select<E, SE>;
13
+ revert(): Select<E, SE>;
14
+ sort(sortFn: (x: E, y: E) => number): Select<E, SE>;
15
+ at(index: number): SingleSelect<E | undefined, SE>;
16
+ find(testFn: TestFn<E>): SingleSelect<E | undefined, SE>;
17
+ from<T>(entities: Iterable<E>): Select<E, SE>;
18
+ from<T>(entities: Iterable<T>, matcher: MatchFn<E, T>): Select<E | undefined, T>;
19
+ on<T>(entry: E): SingleSelect<E, SE>;
20
+ on<T>(entry: T, matcher: MatchFn<E, T>): SingleSelect<E | undefined, T>;
18
21
  }
19
22
  //#endregion
20
23
  //#region src/types.d.ts
21
24
  type ItemId = string | number;
22
25
  type CheckFn<E> = (entity: E) => boolean;
23
- type Selector<E> = ((selector: Select<E>) => SingleSelect<E>) | ((selector: Select<E>) => Select<E>) | ItemId | Iterable<ItemId>;
24
- type UpdateFn<E> = (entity: E | undefined) => E;
25
- type Updater<E> = UpdateFn<E> | Partial<E>;
26
+ type TestFn<E> = (entry: E) => boolean;
27
+ type MatchFn<E, T> = (entity: T, existing: E) => boolean;
28
+ type SelectorSelect<E, EE, SE> = (selector: Select<E, any>) => Select<EE, SE>;
29
+ type SelectorSelectSingle<E, EE, SE> = (selector: Select<E, any>) => SingleSelect<EE, SE>;
30
+ type SelectorChain<E, EE, SE> = SelectorSelect<E, EE, SE> | SelectorSelectSingle<E, EE, SE>;
31
+ type Selector<E, EE, I extends ItemId, SE = E> = SelectorChain<E, EE, SE> | I | Iterable<I>;
32
+ type UpdateFn<E, EE, SE> = (entity: EE, match?: SE) => E;
33
+ type Updater<E, EE, SE = E> = UpdateFn<E, EE, SE> | Partial<E>;
26
34
  type SelectId<E> = (entity: E) => ItemId;
27
35
  type ItemsOptions<E> = {
28
36
  selectId?: SelectId<E>;
@@ -43,37 +51,42 @@ interface ItemsDiff {
43
51
  }
44
52
  //#endregion
45
53
  //#region src/Items.d.ts
46
- declare class Items<E> {
54
+ declare class Items<E extends Object, I extends ItemId = ItemId> {
47
55
  private options;
48
56
  private state;
49
57
  constructor(items?: Iterable<E>, options?: ItemsOptions<E>);
50
- add(items: Iterable<E>): Items<E>;
51
- update(select: Selector<E>, updater: Updater<E>): Items<E>;
52
- merge(items: Iterable<E>): Items<E>;
53
- remove(select: Selector<E>): Items<E>;
54
- pick(select: Selector<E>): Items<E>;
55
- select(select: ItemId): E | undefined;
56
- select(select: Iterable<ItemId>): E[];
57
- select(select: (selector: Select<E>) => Select<E>): E[];
58
- select(select: (selector: Select<E>) => SingleSelect<E>): E | undefined;
59
- selectId(select: (selector: Select<E>) => Select<E>): ItemId[];
60
- selectId(select: (selector: Select<E>) => SingleSelect<E>): ItemId | undefined;
61
- clear(): Items<E>;
58
+ add(items: Iterable<E>): Items<E, I>;
59
+ update<SE, EE>(select: Selector<E, EE, I, SE>, updater: Partial<E>): Items<E, I>;
60
+ update<SE, EE>(select: I | Iterable<I>, updater: Updater<E, E, E>): Items<E, I>;
61
+ update<SE, EE>(select: SelectorChain<E, EE, SE>, updater: Updater<E, EE, SE>): Items<E, I>;
62
+ merge(items: Iterable<E>): Items<E, I>;
63
+ remove<EE extends E = E>(select: Selector<E, EE, I>): Items<E, I>;
64
+ pick<EE extends E = E>(select: Selector<E, EE, I>): Items<E, I>;
65
+ select<EE, SE = never>(select: I): E | undefined;
66
+ select<EE, SE = never>(select: Iterable<I>): E[];
67
+ select<EE, SE = never>(select: SelectorSelect<E, EE, SE>): E[];
68
+ select<EE, SE = never>(select: SelectorSelectSingle<E, EE, SE>): E | undefined;
69
+ selectId<EE, SE = never>(select: I): I | undefined;
70
+ selectId<EE, SE = never>(select: Iterable<I>): I[];
71
+ selectId<EE, SE = never>(select: SelectorSelectSingle<E, EE, SE>): I | undefined;
72
+ selectId<EE, SE = never>(select: SelectorSelect<E, EE, SE>): I[];
73
+ clear(): Items<E, I>;
62
74
  every(check: CheckFn<E>): boolean;
63
75
  some(check: CheckFn<E>): boolean;
64
- has(id: ItemId): boolean;
65
- get(id: ItemId): E | undefined;
66
- getIds(): ItemId[];
76
+ has(id: I): boolean;
77
+ get(id: I): E | undefined;
78
+ get(id: undefined): undefined;
79
+ getIds(): I[];
67
80
  getEntities(): E[];
68
81
  get length(): number;
69
82
  private resolveSelector;
70
83
  private sortIds;
71
- extractId(entity: E): ItemId;
84
+ extractId(entity: E | undefined): I | undefined;
72
85
  private get sortComparer();
73
86
  [Symbol.iterator](): Iterator<E>;
74
- static compare<E>(base: Items<E>, to: Items<E>): {
87
+ static compare<E extends Object, I extends ItemId>(base: Items<E, I>, to: Items<E, I>): {
75
88
  added: ItemId[];
76
- removed: ItemId[];
89
+ removed: I[];
77
90
  updated: any[];
78
91
  };
79
92
  }
package/dist/index.mjs CHANGED
@@ -8,41 +8,60 @@ function defaultSelectId(entity) {
8
8
  //#endregion
9
9
  //#region src/select.ts
10
10
  var BaseSelect = class {
11
- constructor(ids, self) {
12
- this.ids = ids;
13
- this.self = self;
11
+ context;
12
+ constructor(items, context = /* @__PURE__ */ new Map()) {
13
+ this.items = items;
14
+ this.context = this.cleanContext(items, context);
15
+ }
16
+ cleanContext(items, context) {
17
+ if (context.size === 0) return /* @__PURE__ */ new Map();
18
+ const cleanedContext = /* @__PURE__ */ new Map();
19
+ for (const [key, value] of context.entries()) if (items.includes(value)) cleanedContext.set(key, value);
20
+ return cleanedContext;
14
21
  }
15
22
  };
16
23
  var SingleSelect = class extends BaseSelect {};
17
24
  var Select = class Select extends BaseSelect {
18
25
  take(len) {
19
- return new Select(this.ids.slice(0, len), this.self);
26
+ return new Select(this.items.slice(0, len), this.context);
20
27
  }
21
28
  skip(len) {
22
- return new Select(this.ids.slice(len), this.self);
29
+ return new Select(this.items.slice(len), this.context);
23
30
  }
24
31
  filter(testFn) {
25
- return new Select(this.ids.filter((id, index) => {
26
- return testFn(this.self.get(id), id, index);
27
- }), this.self);
32
+ return new Select(this.items.filter((entry) => testFn(entry)), this.context);
28
33
  }
29
34
  revert() {
30
- return new Select([...this.ids].reverse(), this.self);
35
+ return new Select([...this.items].reverse(), this.context);
31
36
  }
32
37
  sort(sortFn) {
33
- return new Select([...this.ids].sort((aId, bId) => {
34
- return sortFn(this.self.get(aId), this.self.get(bId));
35
- }), this.self);
38
+ return new Select([...this.items].sort((a, b) => sortFn(a, b)), this.context);
36
39
  }
37
40
  at(index) {
38
- const id = this.ids[index];
39
- return new SingleSelect([id], this.self);
40
- }
41
- from(entities) {
42
- return new Select(Array.from(entities).map((entry) => this.self.extractId(entry)), this.self);
43
- }
44
- on(entry) {
45
- return new SingleSelect([this.self.extractId(entry)], this.self);
41
+ const item = this.items[index];
42
+ return new SingleSelect([item], this.context);
43
+ }
44
+ find(testFn) {
45
+ const item = this.items.find((entry) => testFn(entry));
46
+ return new SingleSelect(item ? [item] : [], this.context);
47
+ }
48
+ from(entities, matcher) {
49
+ if (matcher) {
50
+ const items = Array.from(entities);
51
+ const pairs = new Map(items.map((entry) => {
52
+ return [entry, this.items.find((item) => matcher(entry, item))];
53
+ }));
54
+ return new Select(Array.from(pairs.values()), pairs);
55
+ } else return new Select(Array.from(entities));
56
+ }
57
+ on(entry, matcher) {
58
+ if (matcher) {
59
+ const select = this.from([entry], matcher);
60
+ return new SingleSelect(select.items, select.context);
61
+ } else {
62
+ const select = this.from([entry]);
63
+ return new SingleSelect(select.items, select.context);
64
+ }
46
65
  }
47
66
  };
48
67
 
@@ -79,7 +98,7 @@ var Items = class Items {
79
98
  this.options = options;
80
99
  const entities = new Map(Array.from(items).map((item) => {
81
100
  return [this.extractId(item), item];
82
- }));
101
+ }).filter(([id]) => id !== void 0));
83
102
  this.state = {
84
103
  ids: this.sortIds([...entities.keys()], entities),
85
104
  entities
@@ -89,28 +108,42 @@ var Items = class Items {
89
108
  const newEntities = new Map(this.state.entities);
90
109
  Array.from(items).forEach((item) => {
91
110
  const id = this.extractId(item);
111
+ if (id === void 0) return;
92
112
  if (!newEntities.has(id)) newEntities.set(id, item);
93
113
  });
94
114
  return new Items(newEntities.values(), this.options);
95
115
  }
96
116
  update(select, updater) {
97
- const [, selectedIds] = this.resolveSelector(select);
117
+ const [, entities, map] = this.resolveSelector(select);
98
118
  const newEntities = new Map(this.state.entities);
99
119
  const isFn = typeof updater === "function";
100
- selectedIds.forEach((id) => {
101
- const entity = newEntities.get(id);
102
- if (isFn) newEntities.set(id, updater(entity));
103
- else if (entity) newEntities.set(id, {
104
- ...entity,
105
- ...updater
120
+ if (isFn && map.size) {
121
+ Array.from(map.entries()).forEach(([entity, pair]) => {
122
+ const updatedEntry = updater(pair, entity);
123
+ const id = this.extractId(updatedEntry);
124
+ newEntities.set(id, updatedEntry);
106
125
  });
126
+ return new Items(newEntities.values(), this.options);
127
+ }
128
+ entities.forEach((entity) => {
129
+ if (isFn) {
130
+ const updatedEntry = updater(entity);
131
+ const id = this.extractId(updatedEntry);
132
+ newEntities.set(id, updatedEntry);
133
+ } else if (entity) {
134
+ const updatedEntry = {
135
+ ...entity,
136
+ ...updater
137
+ };
138
+ const id = this.extractId(updatedEntry);
139
+ newEntities.set(id, updatedEntry);
140
+ }
107
141
  });
108
142
  return new Items(newEntities.values(), this.options);
109
143
  }
110
144
  merge(items) {
111
145
  const newEntities = new Map(this.state.entities);
112
- Array.from(items).forEach((item) => {
113
- const id = this.extractId(item);
146
+ Array.from(items).map((item) => [this.extractId(item), item]).filter(([id]) => id !== void 0).forEach(([id, item]) => {
114
147
  const entry = this.get(id);
115
148
  newEntities.set(id, entry ? {
116
149
  ...entry,
@@ -120,21 +153,23 @@ var Items = class Items {
120
153
  return new Items(newEntities.values(), this.options);
121
154
  }
122
155
  remove(select) {
123
- const [, selectedIds] = this.resolveSelector(select);
156
+ const [, entities] = this.resolveSelector(select);
157
+ const selectedIds = entities.map((entity) => this.extractId(entity));
124
158
  return new Items(this.state.ids.filter((id) => !selectedIds.includes(id)).map((id) => this.get(id)), this.options);
125
159
  }
126
160
  pick(select) {
127
- const [, selectedIds] = this.resolveSelector(select);
128
- return new Items(selectedIds.map((id) => this.get(id)), this.options);
161
+ const [, entities] = this.resolveSelector(select);
162
+ return new Items(entities, this.options);
129
163
  }
130
164
  select(select) {
131
- const [single, selectedIds] = this.resolveSelector(select);
132
- const items = selectedIds.map((id) => this.get(id)).filter(Boolean);
133
- return single ? items[0] : items;
165
+ let [single, entities] = this.resolveSelector(select);
166
+ entities = entities.filter(Boolean);
167
+ return single ? entities[0] : entities;
134
168
  }
135
169
  selectId(select) {
136
- const [single, selectedIds] = this.resolveSelector(select);
137
- return single ? selectedIds[0] : selectedIds;
170
+ let [single, entities] = this.resolveSelector(select);
171
+ entities = entities.filter(Boolean);
172
+ return single ? this.extractId(entities[0]) : entities.map((entity) => this.extractId(entity));
138
173
  }
139
174
  clear() {
140
175
  return new Items([], this.options);
@@ -149,7 +184,7 @@ var Items = class Items {
149
184
  return this.state.ids.includes(id);
150
185
  }
151
186
  get(id) {
152
- return this.state.entities.get(id);
187
+ return id === void 0 ? void 0 : this.state.entities.get(id);
153
188
  }
154
189
  getIds() {
155
190
  return [...this.state.ids];
@@ -162,10 +197,22 @@ var Items = class Items {
162
197
  }
163
198
  resolveSelector(select) {
164
199
  if (typeof select === "function") {
165
- const result = select(new Select(this.state.ids, this));
166
- return [result instanceof SingleSelect, result.ids];
167
- } else if (typeof select === "string" || typeof select === "number") return [true, [select]];
168
- else return [false, Array.from(select)];
200
+ const result = select(new Select(this.getEntities()));
201
+ return [
202
+ result instanceof SingleSelect,
203
+ result.items,
204
+ result.context
205
+ ];
206
+ } else if (typeof select === "string" || typeof select === "number") return [
207
+ true,
208
+ [this.get(select)],
209
+ /* @__PURE__ */ new Map()
210
+ ];
211
+ else return [
212
+ false,
213
+ Array.from(select).map((id) => this.get(id)),
214
+ /* @__PURE__ */ new Map()
215
+ ];
169
216
  }
170
217
  sortIds(ids, entities) {
171
218
  if (this.sortComparer === false) return ids;
@@ -175,6 +222,7 @@ var Items = class Items {
175
222
  });
176
223
  }
177
224
  extractId(entity) {
225
+ if (!entity) return;
178
226
  return this.options?.selectId?.(entity) || defaultSelectId(entity);
179
227
  }
180
228
  get sortComparer() {
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["ids: ItemId[]","self: Items<E>","added: ItemId[]","updated: any[]","options: ItemsOptions<E>"],"sources":["../src/utils.ts","../src/select.ts","../src/diff.ts","../src/Items.ts"],"sourcesContent":["import type { ItemId } from './types'\nexport function defaultSelectId<E extends { id: ItemId }>(entity: E): ItemId {\n return entity.id\n}\n","import type { ItemId } from './types'\nimport type { Items } from './Items'\n\nexport class BaseSelect<E> {\n constructor(\n public ids: ItemId[],\n public self: Items<E>\n ) {}\n}\n\nexport class SingleSelect<E> extends BaseSelect<E> {}\n\nexport class Select<E> extends BaseSelect<E> {\n take(len: number): Select<E> {\n return new Select(this.ids.slice(0, len), this.self)\n }\n\n skip(len: number): Select<E> {\n return new Select(this.ids.slice(len), this.self)\n }\n\n filter(testFn: (entry: E, id: ItemId, index: number) => boolean): Select<E> {\n const filteredIds = this.ids.filter((id, index) => {\n const entry = this.self.get(id)!\n return testFn(entry, id, index)\n })\n return new Select(filteredIds, this.self)\n }\n\n revert(): Select<E> {\n return new Select([...this.ids].reverse(), this.self)\n }\n\n sort(sortFn: (x: E, y: E) => number): Select<E> {\n const sortedIds = [...this.ids].sort((aId, bId) => {\n const a = this.self.get(aId)!\n const b = this.self.get(bId)!\n return sortFn(a, b)\n })\n return new Select(sortedIds, this.self)\n }\n\n at(index: number): SingleSelect<E> {\n const id = this.ids[index]\n return new SingleSelect([id], this.self)\n }\n\n from(entities: Iterable<E>): Select<E> {\n const newIds = Array.from(entities).map(entry => this.self.extractId(entry))\n return new Select(newIds, this.self)\n }\n\n on(entry: E): SingleSelect<E> {\n const id = this.self.extractId(entry)\n return new SingleSelect([id], this.self)\n }\n}\n","import type { ItemId } from './types'\nimport { Items } from './Items'\nimport { diff} from 'ohash/utils'\n\nexport function itemsDiff<E>(fromItems: Items<E>, toItems: Items<E>) {\n const ids = new Set(toItems.getIds())\n const baseIds = new Set(fromItems.getIds())\n\n const added: ItemId[] = []\n const updated: any[] = []\n\n ids.forEach(id => {\n if (!baseIds.has(id)) {\n added.push(id)\n } else {\n const changes = diff(fromItems.select(id), toItems.select(id))\n\n if (changes.length > 0) {\n updated.push({ id, changes })\n }\n\n baseIds.delete(id)\n }\n })\n\n const removed = [...baseIds]\n\n return {\n added,\n removed,\n updated\n }\n}\n","import type { CheckFn, ItemId, ItemsOptions, ItemsState, Selector, Updater } from './types'\nimport { defaultSelectId } from './utils'\nimport { Select, SingleSelect } from './select'\nimport { itemsDiff } from './diff'\n\nexport class Items<E> {\n private state: ItemsState<E, ItemId>\n\n constructor(\n items: Iterable<E> = [],\n private options: ItemsOptions<E> = {}\n ) {\n const entities = new Map(\n Array\n .from(items)\n .map((item) => {\n const id = this.extractId(item)\n return [id, item]\n })\n )\n\n this.state = {\n ids: this.sortIds([...entities.keys()], entities),\n entities\n }\n }\n\n // NOTE: Add item if id not exists\n add(items: Iterable<E>): Items<E> {\n const newEntities = new Map(this.state.entities)\n\n Array.from(items).forEach((item) => {\n const id = this.extractId(item)\n if (!newEntities.has(id)) {\n newEntities.set(id, item)\n }\n })\n\n return new Items<E>(newEntities.values(), this.options)\n }\n\n // NOTE: update selected ids with partial data or call function (even if selected id not exists)\n update(select: Selector<E>, updater: Updater<E>): Items<E> {\n const [, selectedIds] = this.resolveSelector(select)\n const newEntities = new Map(this.state.entities)\n const isFn = typeof updater === 'function'\n\n selectedIds\n .forEach((id) => {\n const entity = newEntities.get(id)\n\n if (isFn) {\n newEntities.set(id, updater(entity))\n } else if (entity) {\n newEntities.set(id, { ...entity, ...updater })\n }\n })\n\n return new Items<E>(newEntities.values(), this.options)\n }\n\n // NOTE: add if not exists, overwrite if exists\n merge(items: Iterable<E>): Items<E> {\n const newEntities = new Map(this.state.entities)\n\n Array.from(items).forEach((item) => {\n const id = this.extractId(item)\n const entry = this.get(id)\n newEntities.set(id, entry ? { ...entry, ...item } : item)\n })\n\n return new Items<E>(newEntities.values(), this.options)\n }\n\n remove(select: Selector<E>): Items<E> {\n const [, selectedIds] = this.resolveSelector(select)\n const idsToKeep = this.state.ids.filter(id => !selectedIds.includes(id))\n const items = idsToKeep.map(id => this.get(id)!)\n return new Items<E>(items, this.options)\n }\n\n pick(select: Selector<E>): Items<E> {\n const [, selectedIds] = this.resolveSelector(select)\n const items = selectedIds.map(id => this.get(id)!)\n return new Items<E>(items, this.options)\n }\n\n select(select: ItemId): E | undefined\n select(select: Iterable<ItemId>): E[]\n select(select: (selector: Select<E>) => Select<E>): E[]\n select(select: (selector: Select<E>) => SingleSelect<E>): E | undefined\n select(select: Selector<E>): undefined | E | E[] {\n const [single, selectedIds] = this.resolveSelector(select)\n const items = selectedIds.map(id => this.get(id)).filter(Boolean) as E[]\n return single ? items[0] : items\n }\n\n selectId(select: (selector: Select<E>) => Select<E>): ItemId[]\n selectId(select: (selector: Select<E>) => SingleSelect<E>): ItemId | undefined\n selectId(select: Selector<E>): undefined | ItemId | ItemId[] {\n const [single, selectedIds] = this.resolveSelector(select)\n return single ? selectedIds[0] : selectedIds\n }\n\n clear(): Items<E> {\n return new Items<E>([], this.options)\n }\n\n every(check: CheckFn<E>) {\n return this.getIds().every(id => check(this.get(id)!))\n }\n\n some(check: CheckFn<E>) {\n return this.getIds().some(id => check(this.get(id)!))\n }\n\n has(id: ItemId) {\n return this.state.ids.includes(id)\n }\n\n get(id: ItemId): E | undefined {\n return this.state.entities.get(id)\n }\n\n getIds(): ItemId[] {\n return [...this.state.ids]\n }\n\n getEntities(): E[] {\n return this.state.ids.map(id => this.get(id)!)\n }\n\n get length(): number {\n return this.state.ids.length\n }\n\n private resolveSelector(select: Selector<E>): [boolean, ItemId[]]{\n if (typeof select === 'function') {\n const newSelect = new Select(this.state.ids, this)\n const result = select(newSelect)\n return [result instanceof SingleSelect, result.ids]\n } else if (typeof select === 'string' || typeof select === 'number') {\n return [true, [select]]\n } else {\n return [false, Array.from(select)]\n }\n }\n\n private sortIds(\n ids: ItemId[],\n entities: Map<ItemId, E>\n ): Array<ItemId> {\n if (this.sortComparer === false) {\n return ids\n }\n const sorter = this.sortComparer\n return [...ids].sort((aId, bId) => {\n const a = entities.get(aId)!\n const b = entities.get(bId)!\n return sorter(a, b)\n })\n }\n\n extractId(entity: E): ItemId {\n return this.options?.selectId?.(entity) as undefined || defaultSelectId(entity as E & { id: ItemId })\n }\n\n private get sortComparer() {\n return this.options.sortComparer || false\n }\n\n [Symbol.iterator](): Iterator<E> {\n return this.state.entities.values()\n }\n\n static compare<E>(base: Items<E>, to: Items<E>) {\n return itemsDiff(base, to)\n }\n}\n\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["items: E[]","added: ItemId[]","updated: any[]","options: ItemsOptions<E>"],"sources":["../src/utils.ts","../src/select.ts","../src/diff.ts","../src/Items.ts"],"sourcesContent":["import type { ItemId } from './types'\nexport function defaultSelectId<E extends { id: ItemId }>(entity: E): ItemId {\n return entity.id\n}\n","import { MatchFn, TestFn } from './types'\n\n// NOTE: E selected items, may be undefined as well\n// NOTE: SE content type\nexport class BaseSelect<E, SE> {\n public context: Map<SE, E>\n\n constructor(\n public items: E[],\n context: Map<SE, E> = new Map()\n ) {\n // Automatically clean context to only include items that exist in items array\n this.context = this.cleanContext(items, context)\n }\n\n private cleanContext(items: E[], context: Map<SE, E>): Map<SE, E> {\n if (context.size === 0) {\n return new Map()\n }\n\n const cleanedContext = new Map<SE, E>()\n for (const [key, value] of context.entries()) {\n if (items.includes(value)) {\n cleanedContext.set(key, value)\n }\n }\n return cleanedContext\n }\n}\n\nexport class SingleSelect<E, SE> extends BaseSelect<E, SE> {}\n\nexport class Select<E, SE> extends BaseSelect<E, SE> {\n take(len: number) {\n return new Select<E, SE>(this.items.slice(0, len), this.context)\n }\n\n skip(len: number) {\n return new Select<E, SE>(this.items.slice(len), this.context)\n }\n\n filter(testFn: TestFn<E>) {\n return new Select<E, SE>(this.items.filter((entry) => testFn(entry)), this.context)\n }\n\n revert(){\n return new Select<E, SE>([...this.items].reverse(), this.context)\n }\n\n sort(sortFn: (x: E, y: E) => number) {\n return new Select<E, SE>([...this.items].sort((a, b) => sortFn(a, b)), this.context)\n }\n\n at(index: number) {\n const item = this.items[index]\n return new SingleSelect<E | undefined, SE>([item], this.context)\n }\n\n find(testFn: TestFn<E>) {\n const item = this.items.find((entry) => testFn(entry))\n return new SingleSelect<E | undefined, SE>(item ? [item] : [], this.context)\n }\n\n from<T>(entities: Iterable<E>): Select<E, SE>\n from<T>(entities: Iterable<T>, matcher: MatchFn<E, T>): Select<E | undefined, T>\n from<T>(entities: Iterable<E> | Iterable<T>, matcher?: MatchFn<E, T>): Select<E, SE> | Select<E | undefined, T> {\n if (matcher) {\n const items = Array.from(entities as Iterable<T>)\n const pairs = new Map(\n items\n .map(entry => {\n const pair = this.items.find(item => matcher(entry, item))\n return [entry, pair]\n }) as [T, E | undefined][]\n )\n return new Select<E | undefined, T>(Array.from(pairs.values()), pairs)\n } else {\n return new Select<E, SE>(Array.from(entities as Iterable<E>))\n }\n }\n\n on<T>(entry: E): SingleSelect<E, SE>\n on<T>(entry: T, matcher: MatchFn<E, T>): SingleSelect<E | undefined, T>\n on<T>(entry: E, matcher?: MatchFn<E, T>): SingleSelect<E, SE> | SingleSelect<E | undefined, T> {\n if (matcher) {\n const select = this.from([entry as unknown as T], matcher)\n return new SingleSelect<E | undefined, T>(select.items, select.context)\n } else {\n const select = this.from([entry])\n return new SingleSelect<E, SE>(select.items, select.context)\n }\n }\n}\n","import type { ItemId } from './types'\nimport { Items } from './Items'\nimport { diff} from 'ohash/utils'\n\nexport function itemsDiff<E extends Object, I extends ItemId>(fromItems: Items<E, I>, toItems: Items<E, I>) {\n const ids = new Set(toItems.getIds())\n const baseIds = new Set(fromItems.getIds())\n\n const added: ItemId[] = []\n const updated: any[] = []\n\n ids.forEach(id => {\n if (!baseIds.has(id)) {\n added.push(id)\n } else {\n const changes = diff(fromItems.select(id), toItems.select(id))\n\n if (changes.length > 0) {\n updated.push({ id, changes })\n }\n\n baseIds.delete(id)\n }\n })\n\n const removed = [...baseIds]\n\n return {\n added,\n removed,\n updated\n }\n}\n","import {\n CheckFn, ItemId, ItemsOptions, ItemsState, Selector, SelectorChain, SelectorSelect,\n SelectorSelectSingle, Updater\n} from './types'\nimport { defaultSelectId } from './utils'\nimport { Select, SingleSelect } from './select'\nimport { itemsDiff } from './diff'\n\nexport class Items<E extends Object, I extends ItemId = ItemId> {\n private state: ItemsState<E, I>\n\n constructor(\n items: Iterable<E> = [],\n private options: ItemsOptions<E> = {}\n ) {\n const entities = new Map(\n Array\n .from(items)\n .map((item) => {\n const id = this.extractId(item)\n return [id, item]\n })\n .filter(([id]) => id !== undefined) as [I, E][]\n )\n\n this.state = {\n ids: this.sortIds([...entities.keys()], entities),\n entities\n }\n }\n\n // NOTE: Add item if id not exists\n add(items: Iterable<E>) {\n const newEntities = new Map(this.state.entities)\n\n Array.from(items).forEach((item) => {\n const id = this.extractId(item)\n if (id === undefined) {\n return\n }\n if (!newEntities.has(id)) {\n newEntities.set(id, item)\n }\n })\n\n return new Items<E, I>(newEntities.values(), this.options)\n }\n\n // NOTE: update selected ids with partial data or call function\n update<SE, EE>(select: Selector<E, EE, I, SE>, updater: Partial<E>): Items<E, I>\n update<SE, EE>(select: I | Iterable<I>, updater: Updater<E, E, E>): Items<E, I>\n update<SE, EE>(select: SelectorChain<E, EE, SE>, updater: Updater<E, EE, SE>): Items<E, I>\n update<SE, EE>(select: Selector<E, EE, I, SE>, updater: Updater<E, EE, SE>): Items<E, I> {\n const [, entities, map] = this.resolveSelector(select)\n const newEntities = new Map(this.state.entities)\n const isFn = typeof updater === 'function'\n\n if (isFn && map.size) {\n Array\n .from(map.entries())\n .forEach(([entity, pair]) => {\n const updatedEntry = updater(pair, entity)\n const id = this.extractId(updatedEntry)!\n newEntities.set(id, updatedEntry)\n })\n\n return new Items<E, I>(newEntities.values(), this.options)\n }\n\n entities\n .forEach((entity) => {\n if (isFn) {\n const updatedEntry = updater(entity)\n const id = this.extractId(updatedEntry)!\n newEntities.set(id, updatedEntry)\n } else if (entity) {\n const updatedEntry = { ...(entity as unknown as E), ...updater }\n const id = this.extractId(updatedEntry)!\n newEntities.set(id, updatedEntry)\n }\n })\n\n return new Items<E, I>(newEntities.values(), this.options)\n }\n\n // NOTE: add if not exists, overwrite if exists\n merge(items: Iterable<E>) {\n const newEntities = new Map(this.state.entities)\n\n Array\n .from(items)\n .map(item => [this.extractId(item), item] as [I, E])\n .filter(([id]) => id !== undefined)\n .forEach(([id, item]) => {\n const entry = this.get(id)\n newEntities.set(id, entry ? { ...entry, ...item } : item)\n })\n\n return new Items<E, I>(newEntities.values(), this.options)\n }\n\n remove<EE extends E = E>(select: Selector<E, EE, I>) {\n const [, entities] = this.resolveSelector(select)\n const selectedIds = entities.map(entity => this.extractId(entity as E))\n const idsToKeep = this.state.ids.filter(id => !selectedIds.includes(id))\n const items = idsToKeep.map(id => this.get(id)!)\n return new Items<E, I>(items, this.options)\n }\n\n pick<EE extends E = E>(select: Selector<E, EE, I>) {\n const [, entities] = this.resolveSelector(select)\n return new Items<E, I>(entities as E[], this.options)\n }\n\n select<EE, SE = never>(select: I): E | undefined\n select<EE, SE = never>(select: Iterable<I>): E[]\n select<EE, SE = never>(select: SelectorSelect<E, EE, SE>): E[]\n select<EE, SE = never>(select: SelectorSelectSingle<E, EE, SE>): E | undefined\n select<EE, SE = never>(select: Selector<E, EE, I, SE>): undefined | E | E[] {\n let [single, entities] = this.resolveSelector(select)\n entities = entities.filter(Boolean)\n return single ? entities[0] as unknown as E : entities as unknown as E[]\n }\n\n selectId<EE, SE = never>(select: I): I | undefined\n selectId<EE, SE = never>(select: Iterable<I>): I[]\n selectId<EE, SE = never>(select: SelectorSelectSingle<E, EE, SE>): I | undefined\n selectId<EE, SE = never>(select: SelectorSelect<E, EE, SE>): I[]\n selectId<EE, SE = never>(select: Selector<E, EE, I, SE>): undefined | I | I[] {\n let [single, entities] = this.resolveSelector(select)\n entities = entities.filter(Boolean)\n return single\n ? this.extractId(entities[0] as unknown as E)\n : entities.map(entity => this.extractId(entity as unknown as E)!)\n }\n\n clear() {\n return new Items<E, I>([], this.options)\n }\n\n every(check: CheckFn<E>) {\n return this.getIds().every(id => check(this.get(id)!))\n }\n\n some(check: CheckFn<E>) {\n return this.getIds().some(id => check(this.get(id)!))\n }\n\n has(id: I) {\n return this.state.ids.includes(id)\n }\n\n get(id: I ): E | undefined\n get(id: undefined): undefined\n get(id: I | undefined): E | undefined {\n return id === undefined ? undefined : this.state.entities.get(id)\n }\n\n getIds(): I[] {\n return [...this.state.ids]\n }\n\n getEntities(): E[] {\n return this.state.ids.map(id => this.get(id)!)\n }\n\n get length(): number {\n return this.state.ids.length\n }\n\n private resolveSelector<EE, SE>(select: Selector<E, EE, I, SE>): [boolean, EE[], Map<SE, EE>] {\n if (typeof select === 'function') {\n const newSelect = new Select<E, unknown>(this.getEntities())\n const result = select(newSelect)\n return [result instanceof SingleSelect, result.items as EE[], result.context as Map<SE, EE>]\n } else if (typeof select === 'string' || typeof select === 'number') {\n return [true, [this.get(select) as EE], new Map()]\n } else {\n return [false, Array.from(select).map(id => this.get(id) as EE), new Map()]\n }\n }\n\n private sortIds(\n ids: I[],\n entities: Map<I, E>\n ): Array<I> {\n if (this.sortComparer === false) {\n return ids\n }\n const sorter = this.sortComparer\n return [...ids].sort((aId, bId) => {\n const a = entities.get(aId)!\n const b = entities.get(bId)!\n return sorter(a, b)\n })\n }\n\n extractId(entity: E | undefined): I | undefined {\n if (!entity) {\n return undefined\n }\n\n return (this.options?.selectId?.(entity) || defaultSelectId(entity as E & { id: I })) as I\n }\n\n private get sortComparer() {\n return this.options.sortComparer || false\n }\n\n [Symbol.iterator](): Iterator<E> {\n return this.state.entities.values()\n }\n\n static compare<E extends Object, I extends ItemId>(base: Items<E, I>, to: Items<E, I>) {\n return itemsDiff(base, to)\n }\n}\n\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wszerad/items",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./dist/index.mjs",