rambdax
Version:
Extended version of Rambda - a lightweight, faster alternative to Ramda
68 lines (55 loc) • 1.56 kB
JavaScript
import { compose } from './compose'
import { map } from './map'
import { replace } from './replace'
import { sort } from './sort'
import { take } from './take'
import { type } from './type'
const cache = {}
const normalizeObject = obj => {
const sortFn = (a, b) => a > b ? 1 : -1
const willReturn = {}
compose(map(prop => willReturn[ prop ] = obj[ prop ]),
sort(sortFn))(Object.keys(obj))
return willReturn
}
const stringify = a => {
if (type(a) === 'String'){
return a
} else if ([ 'Function', 'Async' ].includes(type(a))){
const compacted = replace(
/\s{1,}/g, ' ', a.toString()
)
return replace(
/\s/g, '_', take(15, compacted)
)
} else if (type(a) === 'Object'){
return JSON.stringify(normalizeObject(a))
}
return JSON.stringify(a)
}
const generateProp = (fn, ...inputArguments) => {
let propString = ''
inputArguments.forEach(inputArgument => {
propString += `${ stringify(inputArgument) }_`
})
return `${ propString }${ stringify(fn) }`
}
// with weakmaps
export function memoize(fn, ...inputArguments){
if (arguments.length === 1){
return (...inputArgumentsHolder) => memoize(fn, ...inputArgumentsHolder)
}
const prop = generateProp(fn, ...inputArguments)
if (prop in cache) return cache[ prop ]
if (type(fn) === 'Async'){
return new Promise(resolve => {
fn(...inputArguments).then(result => {
cache[ prop ] = result
resolve(result)
})
})
}
const result = fn(...inputArguments)
cache[ prop ] = result
return result
}