4.0.12 • Published 7 months ago

@thi.ng/memoize v4.0.12

Weekly downloads
2,892
License
Apache-2.0
Repository
github
Last release
7 months ago

memoize

npm version npm downloads Twitter Follow

This project is part of the @thi.ng/umbrella monorepo.

About

Function memoization with configurable caching.

This package provides different function memoization implementations for functions with 1 or more arguments and custom result caching using ES6 Map API like implementations. Unlike native ES6 Maps, the implementations MUST support value, not just referential, equality semantics (e.g. those provided by @thi.ng/associative) or @thi.ng/cache). The latter also support automatically pruning of memoization caches, based on different strategies. See doc strings for further details.

Status

STABLE - used in production

Search or submit any issues for this package

Related packages

  • @thi.ng/cache - In-memory cache implementations with ES6 Map-like API and different eviction strategies

Installation

yarn add @thi.ng/memoize

ES module import:

<script type="module" src="https://cdn.skypack.dev/@thi.ng/memoize"></script>

Skypack documentation

For Node.js REPL:

# with flag only for < v16
node --experimental-repl-await

> const memoize = await import("@thi.ng/memoize");

Package sizes (gzipped, pre-treeshake): ESM: 282 bytes

Dependencies

Usage examples

Several demos in this repo's /examples directory are using this package.

A selection:

ScreenshotDescriptionLive demoSource
Isolated, component-local DOM updatesDemoSource
Basic rstream-gestures multi-touch demoDemoSource
rstream based spreadsheet w/ S-expression formula DSLDemoSource

API

Generated API docs

import * as m from "@thi.ng/memoize";

// (optional, for custom caching)
import { EquivMap } from "@thi.ng/associative";
import { LRUCache } from "@thi.ng/cache";

Optimized version for single arg functions

foo = m.memoize1((x) => (console.log("exec"), x * 10));
foo(1);
// exec
// 10
foo(1);
// 10

// with custom cache
foo = m.memoize1(
    (x) => (console.log("exec"), x[0] * 10),
    new EquivMap()
);

foo([1]);
// exec
// 10
foo([1]); // wouldn't work w/ native ES6 Map as cache
// 10

// use LRU cache to limit cache size
foo = m.memoize1(
    (x) => (console.log("exec"), x[0] * 10),
    new LRUCache(null, { maxlen: 3 })
);

Arbitrary args

dotProduct = m.memoize(
    (x, y) => (console.log("exec"), x[0] * y[0] + x[1] * y[1]),
    new EquivMap()
);

dotProduct([1,2], [3,4]);
// exec
// 11
dotProduct([1,2], [3,4]);
// 11

Via JSON.stringify()

dotProduct = m.memoizeJ(
    (x, y) => (console.log("exec"), x[0] * y[0] + x[1] * y[1])
);
dotProduct([1,2], [3,4]);
// exec
// 11
dotProduct([1,2], [3,4]);
// 11

Authors

Karsten Schmidt

If this project contributes to an academic publication, please cite it as:

@misc{thing-memoize,
  title = "@thi.ng/memoize",
  author = "Karsten Schmidt",
  note = "https://thi.ng/memoize",
  year = 2018
}

License

© 2018 - 2021 Karsten Schmidt // Apache Software License 2.0

4.0.12

7 months ago

4.0.11

8 months ago

4.0.9

9 months ago

4.0.8

9 months ago

4.0.10

8 months ago

4.0.7

9 months ago

4.0.6

10 months ago

4.0.5

10 months ago

4.0.4

10 months ago

4.0.3

11 months ago

4.0.2

11 months ago

4.0.1

12 months ago

4.0.0

12 months ago

3.3.9

1 year ago

3.3.8

1 year ago

3.3.7

1 year ago

3.3.6

1 year ago

3.3.13

1 year ago

3.3.10

1 year ago

3.3.11

1 year ago

3.3.12

1 year ago

3.3.5

1 year ago

3.3.4

1 year ago

3.3.3

1 year ago

3.3.2

1 year ago

3.3.1

2 years ago

3.3.0

2 years ago

3.2.0

2 years ago

3.1.65

2 years ago

3.1.64

2 years ago

3.1.63

2 years ago

3.1.62

2 years ago

3.1.61

2 years ago

3.1.59

2 years ago

3.1.60

2 years ago

3.1.58

2 years ago

3.1.57

2 years ago

3.1.56

2 years ago

3.1.55

2 years ago

3.1.54

2 years ago

3.1.53

2 years ago

3.1.52

2 years ago

3.1.51

2 years ago

3.1.50

2 years ago

3.1.49

2 years ago

3.1.47

2 years ago

3.1.48

2 years ago

3.1.46

2 years ago

3.1.45

2 years ago

3.1.34

2 years ago

3.1.33

2 years ago

3.1.36

2 years ago

3.1.35

2 years ago

3.1.38

2 years ago

3.1.37

2 years ago

3.1.39

2 years ago

3.1.44

2 years ago

3.1.41

2 years ago

3.1.40

2 years ago

3.1.43

2 years ago

3.1.42

2 years ago

3.1.32

2 years ago

3.1.31

2 years ago

3.1.30

3 years ago

3.1.27

3 years ago

3.1.29

3 years ago

3.1.28

3 years ago

3.1.26

3 years ago

3.1.23

3 years ago

3.1.25

3 years ago

3.1.24

3 years ago

3.1.22

3 years ago

3.1.21

3 years ago

3.1.20

3 years ago

3.1.19

3 years ago

3.1.14

3 years ago

3.1.13

3 years ago

3.1.16

3 years ago

3.1.15

3 years ago

3.1.18

3 years ago

3.1.17

3 years ago

3.1.12

3 years ago

3.1.11

3 years ago

3.1.10

3 years ago

3.1.9

3 years ago

3.1.8

3 years ago

3.1.7

3 years ago

3.1.6

3 years ago

3.1.5

4 years ago

3.1.4

4 years ago

3.0.8

4 years ago

3.1.3

4 years ago

3.1.2

4 years ago

3.1.1

4 years ago

3.1.0

4 years ago

3.0.7

4 years ago

3.0.4

4 years ago

3.0.6

4 years ago

3.0.3

4 years ago

3.0.2

4 years ago

3.0.1

4 years ago

3.0.0

4 years ago

2.1.21

4 years ago

2.1.20

4 years ago

2.1.18

4 years ago

2.1.19

4 years ago

2.1.17

4 years ago

2.1.16

4 years ago

2.1.15

4 years ago

2.1.14

5 years ago

2.1.12

5 years ago

2.1.13

5 years ago

2.1.10

5 years ago

2.1.11

5 years ago

2.1.9

5 years ago

2.1.8

5 years ago

2.1.7

5 years ago

2.1.6

5 years ago

2.1.5

5 years ago

2.1.4

5 years ago

2.1.3

5 years ago

2.1.2

5 years ago

2.1.1

5 years ago

2.1.0

5 years ago

2.0.19

5 years ago

2.0.18

5 years ago

2.0.17

5 years ago

2.0.16

5 years ago

2.0.15

5 years ago

2.0.14

5 years ago

2.0.13

5 years ago

2.0.12

5 years ago

2.0.11

5 years ago

2.0.10

5 years ago

2.0.9

5 years ago

2.0.8

5 years ago

2.0.7

6 years ago

2.0.6

6 years ago

2.0.5

6 years ago

2.0.4

6 years ago

2.0.3

6 years ago

2.0.2

6 years ago

2.0.1

6 years ago

2.0.0

6 years ago

1.1.8

6 years ago

1.1.7

6 years ago

1.1.6

6 years ago

1.1.5

6 years ago

1.1.4

6 years ago

1.1.3

6 years ago

1.1.2

6 years ago

1.1.1

6 years ago

1.1.0

6 years ago

1.0.9

6 years ago

1.0.8

6 years ago

1.0.7

6 years ago

1.0.6

7 years ago

1.0.5

7 years ago

1.0.4

7 years ago

1.0.3

7 years ago

1.0.2

7 years ago

1.0.1

7 years ago

1.0.0

7 years ago

0.2.6

7 years ago

0.2.5

7 years ago

0.2.4

7 years ago

0.2.3

7 years ago

0.2.2

7 years ago

0.2.1

7 years ago

0.2.0

7 years ago

0.1.2

7 years ago

0.1.1

7 years ago

0.1.0

7 years ago

0.0.1

7 years ago