recoil
Version:
Recoil - A state management library for React
75 lines (64 loc) • 2.02 kB
Flow
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @emails oncall+recoil
* @flow strict
* @format
*/
;
import type {CacheImplementation} from './Recoil_CacheImplementationType';
import type {
CachePolicy,
EqualityPolicy,
EvictionPolicy,
} from './Recoil_CachePolicy';
const {LRUCache} = require('./Recoil_LRUCache');
const {MapCache} = require('./Recoil_MapCache');
const err = require('recoil-shared/util/Recoil_err');
const nullthrows = require('recoil-shared/util/Recoil_nullthrows');
const stableStringify = require('recoil-shared/util/Recoil_stableStringify');
const defaultPolicy = {
equality: 'reference',
eviction: 'none',
maxSize: Infinity,
};
function cacheFromPolicy<K, V>({
equality = defaultPolicy.equality,
eviction = defaultPolicy.eviction,
maxSize = defaultPolicy.maxSize,
}: CachePolicy = defaultPolicy): CacheImplementation<K, V> {
const valueMapper = getValueMapper(equality);
const cache = getCache<K, V>(eviction, maxSize, valueMapper);
return cache;
}
function getValueMapper(equality: EqualityPolicy): mixed => mixed {
switch (equality) {
case 'reference':
return val => val;
case 'value':
return val => stableStringify(val);
}
throw err(`Unrecognized equality policy ${equality}`);
}
function getCache<K, V>(
eviction: EvictionPolicy,
maxSize: ?number,
mapKey: mixed => mixed,
): CacheImplementation<K, V> {
switch (eviction) {
case 'keep-all':
// $FlowFixMe[method-unbinding]
return new MapCache<K, V>({mapKey});
case 'lru':
// $FlowFixMe[method-unbinding]
return new LRUCache<K, V>({mapKey, maxSize: nullthrows(maxSize)});
case 'most-recent':
// $FlowFixMe[method-unbinding]
return new LRUCache<K, V>({mapKey, maxSize: 1});
}
throw err(`Unrecognized eviction policy ${eviction}`);
}
module.exports = cacheFromPolicy;