Skip to content

Commit

Permalink
feat(ValueObject): filter by key
Browse files Browse the repository at this point in the history
  • Loading branch information
slikts committed Feb 22, 2020
1 parent 80a9f8f commit fa8b280
Show file tree
Hide file tree
Showing 4 changed files with 18 additions and 5 deletions.
10 changes: 7 additions & 3 deletions src/DeepCompositeSymbol.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,13 @@ import Tuple from './Tuple';
import { isObject } from './helpers';

// tslint:disable-next-line: variable-name
const DeepCompositeSymbol: typeof Tuple.symbol = ((object: any) => {
const entries = Object.entries(object);
const DeepCompositeSymbol = ((object: any, keyFilter?: (key: string) => boolean) => {
const entries = keyFilter
? Object.entries(object).filter(entry => keyFilter(entry[0]))
: Object.entries(object);
// Recursively replace non-tuple object values with tuples
entries.forEach(update);
return Tuple.unsafeSymbol(...Array.prototype.concat.apply([], entries));
return Tuple.unsafeSymbol(...flatten(entries));
}) as any;

const update = (entry: any) => {
Expand All @@ -16,4 +18,6 @@ const update = (entry: any) => {
}
};

const flatten = (entries: any[][]) => Array.prototype.concat.apply([], entries);

export default DeepCompositeSymbol;
4 changes: 2 additions & 2 deletions src/ValueObject.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ import DeepCompositeSymbol from './DeepCompositeSymbol';
* https://github.com/tc39/proposal-record-tuple
*/
// tslint:disable-next-line: variable-name
const ValueObject = <A extends object>(object: A, filterKeys?: (key: string) => boolean): A => {
const key = DeepCompositeSymbol(object, filterKeys);
const ValueObject = <A extends object>(object: A, keyFilter?: (key: string) => boolean): A => {
const key = DeepCompositeSymbol(object, keyFilter);
if (cache.has(key)) {
return cache.get(key) as A;
}
Expand Down
8 changes: 8 additions & 0 deletions test/DeepCompositeSymbol.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,12 @@ describe(DeepCompositeSymbol.name, () => {
expect(DeepCompositeSymbol(o())).toBe(DeepCompositeSymbol(o()));
expect(DeepCompositeSymbol(o())).not.toBe(DeepCompositeSymbol({}));
});

it('allows filtering by key', () => {
const o1 = { a: { c: 1 }, b: 2, _d: 3 };
const o2 = { ...o1, _d: 4 };
const filter = (key: string) => !key.startsWith('_');
expect(DeepCompositeSymbol(o1, filter)).toBe(DeepCompositeSymbol(o2, filter));
expect(DeepCompositeSymbol(o1)).not.toBe(DeepCompositeSymbol(o2));
});
});
1 change: 1 addition & 0 deletions test/ValueObject.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ describe(ValueObject.name, () => {
o.b = 3;
const vO2 = ValueObject(o);

expect(vO2.b).toBe(o.b);
expect(vO1).not.toBe(vO2);
expect(ValueObject(vO2)).toBe(ValueObject(vO2));
});
Expand Down

0 comments on commit fa8b280

Please sign in to comment.