From 252791ba94e1a07e15cef57d0e9696a966285aad Mon Sep 17 00:00:00 2001 From: Gabriel Preda Date: Wed, 9 Mar 2022 11:33:57 +0200 Subject: [PATCH 1/3] auto Table of contents --- packages/memoize/src/README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/packages/memoize/src/README.md b/packages/memoize/src/README.md index 64341d1..b064cb4 100644 --- a/packages/memoize/src/README.md +++ b/packages/memoize/src/README.md @@ -2,6 +2,17 @@ Fastest memoize library available. +## Table of contents +- [@OSW/Memoize](#oswmemoize) + - [Table of contents](#table-of-contents) + - [Features:](#features) + - [API](#api) + - [Building](#building) + - [Running unit tests](#running-unit-tests) +- [Roadmap](#roadmap) + - [Nice to have](#nice-to-have) +- [Limitations](#limitations) + ## Features: - Simple and fully typed API From f1fd23534abd91357ff036392d0f0ebe6417a02a Mon Sep 17 00:00:00 2001 From: Gabriel Preda Date: Wed, 16 Mar 2022 12:47:48 +0200 Subject: [PATCH 2/3] updated read-me --- packages/memoize/src/README.md | 48 ++++++++++++++++++- .../memoize-store.interface.api.ts | 5 +- packages/memoize/src/lib/memoize.api.spec.ts | 40 ++++++++++++++++ packages/memoize/src/lib/memoize.api.ts | 2 + .../memoize/src/lib/memoize.interface.api.ts | 2 + packages/memoize/src/lib/shared.ts | 6 +++ 6 files changed, 100 insertions(+), 3 deletions(-) diff --git a/packages/memoize/src/README.md b/packages/memoize/src/README.md index b064cb4..1aadcec 100644 --- a/packages/memoize/src/README.md +++ b/packages/memoize/src/README.md @@ -3,10 +3,14 @@ Fastest memoize library available. ## Table of contents + - [@OSW/Memoize](#oswmemoize) - [Table of contents](#table-of-contents) - [Features:](#features) - - [API](#api) + - [Usage](#usage) + - [API](#api) + - [Options](#options) + - [Example](#example) - [Building](#building) - [Running unit tests](#running-unit-tests) - [Roadmap](#roadmap) @@ -25,7 +29,47 @@ Fastest memoize library available. - 1 KB gzipped and minified with bundled dependencies - Compatible with all module systems available - ESM, CJS, AMD, System, UMD, etc. -## API +## Usage + +### API + +Memoizing a usual non recursive function: + +```ts +const memoizedFunction = memoize(yourFunction); +memoizedFunction(param1,param2,...); +``` +If the function you're trying to memoize proves to be more of a headache than anticipated there are more direct methods of accomplishing this task, and options that will be explained. + +For recursive functions: + +```ts +const memoizedFunction = memoize(yourFunction); +memoizedFunction(param1,param2,...); +``` + +### Options + +| option | description | usage | +|-----------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------| +| async : bool | Sets the type of function (sync/async) | | +| recursive : bool | Sets the type of function (recursive/non-recursive) | | +| thisArg : any | Sets the "this" argument of the function. Must be used for methods, inside the class. | memoizedMethod = memoize(this.yourMethod, { thisArg: this }); | +| stringify | No clue how this works | | +| store : IMemoizeStoreOptions | Custom store that can be used externally. Defaults to: Map | const yourStore = new Map();
memoizedFunction = memoize(yourFunction, { store: yourStore }); | +| size : IMemoizeStoreSize | Size options - Defaults to: undefined - infinite size | memoizedFunction = memoize(yourFunction, { size: { max: 2, removeStrategy: 'clear' }); | +| size.max : number | Maximum number of entries allowed in the store | const store = new MemoizeStore( size: { max: 2 }); | +| size.removeStrategy : IMemoizeStoreRemoveStrategy | Remove strategy if the storage is full. Defaults to: 'oldest' which enforces a LRU caching strategy. Available options 'clear' \| 'oldest' | const store = new MemoizeStore( size: { removeStrategy: 'clear' }); | +| time : IMemoizeStoreTime | Storage time options. Defaults to: undefined - infinite time span | const store = new MemoizeStore( time: { max: 3,period: 1, unit: 's' } );
memoizedFunction = memoize(yourFunction, store); | +| time.max : number | Maximum time allowed. Defaults to: 'NaN' | const store = new MemoizeStore( time: { max: 3 } ); | +| time.period : number | Periodically clear the expired entries. Uses the same time unit as `max` - Defaults to undefined | const store = new MemoizeStore( time: { period: 1} ); | +| time.unit : IMemoizeStoreTimeUnits | Time unit - Defaults to: 'ms'. Available options 'ms', 's', 'm', 'h', 'd' | const store = new MemoizeStore( time: {unit: 's' } ); | + +## Example + +```ts + +``` ## Building diff --git a/packages/memoize/src/lib/memoize-store/memoize-store.interface.api.ts b/packages/memoize/src/lib/memoize-store/memoize-store.interface.api.ts index 576803c..7210959 100644 --- a/packages/memoize/src/lib/memoize-store/memoize-store.interface.api.ts +++ b/packages/memoize/src/lib/memoize-store/memoize-store.interface.api.ts @@ -8,11 +8,12 @@ export interface IMemoizeStore { /** Clears the entire store */ clear: () => void; } - export interface IMemoizeStoreMetadata { + /** Stores start date in unix time?? */ addedOn: number; } +/** User defined storage container */ export interface IMemoizeStoreOptions { /** Custom store that can be used externally. Defaults to: Map */ store?: IMemoizeStore; @@ -22,6 +23,7 @@ export interface IMemoizeStoreOptions { time?: IMemoizeStoreTime; } +/** User defined storage capacity */ export interface IMemoizeStoreSize { /** Maximum number of entries allowed in the store. Defaults to: 'NaN' */ max: number; @@ -29,6 +31,7 @@ export interface IMemoizeStoreSize { removeStrategy?: IMemoizeStoreRemoveStrategy; } +/** User defined storage lifespan */ export interface IMemoizeStoreTime { /** Maximum time allowed. Defaults to: 'NaN' */ max: number; diff --git a/packages/memoize/src/lib/memoize.api.spec.ts b/packages/memoize/src/lib/memoize.api.spec.ts index 748e1aa..9cfc03a 100644 --- a/packages/memoize/src/lib/memoize.api.spec.ts +++ b/packages/memoize/src/lib/memoize.api.spec.ts @@ -295,4 +295,44 @@ describe('Memoize - all default APIs should work as expected', () => { expect(memoizedTime).toBeGreaterThan(memoizedAsyncRecursiveTime); } }); + it('Example Test', () => { + let actualCalls = 0; + function testFunction(a: number, b: number) { + actualCalls++; + return a + b; + } + const a = 10; + console.log('Theoretical no. of function calls with no memoization: ' + a * a * a); + const memoizedTestFunction = memoize(testFunction); + for (let k = 0; k < a; k++) { + for (let i = 0; i < a; i++) { + for (let j = 0; j < a; j++) { + memoizedTestFunction(i, j); + } + } + } + + console.log('No. of function calls with memoization: ' + actualCalls); + }); + + it('Example Test 2', () => { + let actualCalls = 0; + const fib = memoize(async (num: number): Promise => { + actualCalls++; + if (num < 2) { + return Promise.resolve(num); + } else { + return (await fib(num - 1)) + (await fib(num - 2)); + } + }); + const a = 10; + + for (let k = 0; k < a; k++) { + for (let j = 0; j < a; j++) { + fib(j); + } + } + + console.log('No. of function calls with memoization: ' + actualCalls); + }); }); diff --git a/packages/memoize/src/lib/memoize.api.ts b/packages/memoize/src/lib/memoize.api.ts index 930107a..68b6690 100644 --- a/packages/memoize/src/lib/memoize.api.ts +++ b/packages/memoize/src/lib/memoize.api.ts @@ -18,6 +18,8 @@ export function memoizeLast( ) { return memoize(callback, { ...options, size: { max: 1 } }); } + +/** All in one memoization function, selects the correct function for the options given */ export function memoize< T extends MemoizeCallback | MemoizeAsyncCallback, R extends MemoizedFunction | MemoizedAsyncFunction = T extends MemoizeCallback diff --git a/packages/memoize/src/lib/memoize.interface.api.ts b/packages/memoize/src/lib/memoize.interface.api.ts index 22bd96f..c7b8d21 100644 --- a/packages/memoize/src/lib/memoize.interface.api.ts +++ b/packages/memoize/src/lib/memoize.interface.api.ts @@ -2,10 +2,12 @@ import { IMemoizeStoreOptions } from './memoize-store/memoize-store.interface.ap import { MemoizeStringify } from './memoize/memoize.interface'; export interface MemoizeBaseOptions extends IMemoizeStoreOptions { +/** Sets the "this" argument of the function. Must be used for methods, inside the class. */ thisArg?: any; stringify?: MemoizeStringify; } +/** Type of the function to be memoized */ export interface MemoizeOptions extends MemoizeBaseOptions { async?: boolean; recursive?: boolean; diff --git a/packages/memoize/src/lib/shared.ts b/packages/memoize/src/lib/shared.ts index def6083..5e146a6 100644 --- a/packages/memoize/src/lib/shared.ts +++ b/packages/memoize/src/lib/shared.ts @@ -58,3 +58,9 @@ export function isAsyncFunction Date: Sat, 19 Mar 2022 13:35:30 +0200 Subject: [PATCH 3/3] Improved options table readability --- packages/memoize/src/README.md | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/packages/memoize/src/README.md b/packages/memoize/src/README.md index 1aadcec..ad5a7c5 100644 --- a/packages/memoize/src/README.md +++ b/packages/memoize/src/README.md @@ -50,20 +50,30 @@ memoizedFunction(param1,param2,...); ### Options -| option | description | usage | +| Option | Description | Usage | |-----------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------| | async : bool | Sets the type of function (sync/async) | | | recursive : bool | Sets the type of function (recursive/non-recursive) | | | thisArg : any | Sets the "this" argument of the function. Must be used for methods, inside the class. | memoizedMethod = memoize(this.yourMethod, { thisArg: this }); | | stringify | No clue how this works | | | store : IMemoizeStoreOptions | Custom store that can be used externally. Defaults to: Map | const yourStore = new Map();
memoizedFunction = memoize(yourFunction, { store: yourStore }); | -| size : IMemoizeStoreSize | Size options - Defaults to: undefined - infinite size | memoizedFunction = memoize(yourFunction, { size: { max: 2, removeStrategy: 'clear' }); | -| size.max : number | Maximum number of entries allowed in the store | const store = new MemoizeStore( size: { max: 2 }); | -| size.removeStrategy : IMemoizeStoreRemoveStrategy | Remove strategy if the storage is full. Defaults to: 'oldest' which enforces a LRU caching strategy. Available options 'clear' \| 'oldest' | const store = new MemoizeStore( size: { removeStrategy: 'clear' }); | -| time : IMemoizeStoreTime | Storage time options. Defaults to: undefined - infinite time span | const store = new MemoizeStore( time: { max: 3,period: 1, unit: 's' } );
memoizedFunction = memoize(yourFunction, store); | -| time.max : number | Maximum time allowed. Defaults to: 'NaN' | const store = new MemoizeStore( time: { max: 3 } ); | -| time.period : number | Periodically clear the expired entries. Uses the same time unit as `max` - Defaults to undefined | const store = new MemoizeStore( time: { period: 1} ); | -| time.unit : IMemoizeStoreTimeUnits | Time unit - Defaults to: 'ms'. Available options 'ms', 's', 'm', 'h', 'd' | const store = new MemoizeStore( time: {unit: 's' } ); | +| size : IMemoizeStoreSize * | Size options - Defaults to: undefined - infinite size | memoizedFunction = memoize(yourFunction, { size: { max: 2, removeStrategy: 'clear' }); | +| time : IMemoizeStoreTime ** | Storage time options. Defaults to: undefined - infinite time span | const store = new MemoizeStore( time: { max: 3,period: 1, unit: 's' } );
memoizedFunction = memoize(yourFunction, store); | + +*For size there is: + +| Field | Description | Usage | +|-----------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------| +| size.max : number | Maximum number of entries allowed in the store | const store = new MemoizeStore( size: { max: 2 }); | +| size.removeStrategy : IMemoizeStoreRemoveStrategy | Remove strategy if the storage is full. Defaults to: 'oldest' which enforces a LRU caching strategy. Available options 'clear' \| 'oldest' | const store = new MemoizeStore( size: { removeStrategy: 'clear' }); | + +**For time there is: + +| Field | Description | Usage | +|--------------------------------------|-----------------------------------------------------------------------------------------------------|----------------------------------------------------------| +| time.max : number | Maximum time allowed. Defaults to: 'NaN' | const store = new MemoizeStore( time: { max: 3 } ); | +| time.period : number | Periodically clear the expired entries. Uses the same time unit as `max` - Defaults to undefined | const store = new MemoizeStore( time: { period: 1} ); | +| time.unit : IMemoizeStoreTimeUnits | Time unit - Defaults to: 'ms'. Available options 'ms', 's', 'm', 'h', 'd' | const store = new MemoizeStore( time: { unit: 's' } ); | ## Example