npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@opdime/cache

v0.5.2

Published

A simple higher order function to generate cached copies of functions.

Downloads

38

Readme

Cache-JS


Cache-JS is a library which makes it easy to create cached versions of a function which takes a long time to execute. This caching can be applied on asynchronous functions as well as synchronous functions. At the moment, there are three possible ways to create a cached function: one way for synchronous functions and two ways for asynchronous functions. The reasoning for this will be shown later. First, let's have a look on how we can create a cached versions of a synchronous functions.

Note! Only primitive arguments (string, number, boolean) are taken into account for caching! If the function you want to cache requires an object for configuration, consider wrapping it into another function which then only takes primitive values as arguments.

Note! By setting the repackDeep flag to true, the function will always create a deep copy of the value which has been stored in the cache. Otherwise it will just create a flat copy to remove the common reference to the cached object.

Note! If a cached value is strictly equal to undefined, the original function is going to be executed, to retrieve an up-to-date result. That will not result in a recursive call until a non-undefined is returned! It will only call the original once again, not regarding the type of the result of the result. However, this does not apply, if the function returns null! That is a valid result because the library does not check based on truthiness, but on the actual value not being undefined.

cache(original, repackDeep = false)

The normal cache function takes a function as its onliest argument and returns a new function, which uses a cache to store function result and arguments. If the wrapped function returns an object or an array, it will automatically destructure that object and repack it into a new object/array, so the cache and the returned result to not share a common reference.

const { cache } = require('@opdime/cache');
// or
import { cache } from '@opdime/cache';
// later imports will only be in this ES6 format
function someExpensiveMathematicalFunction(x, y, z) {
  // maybe much vector calculus..
  // with some factorials inbetween..
  return {
    x, y, z
  };
}

const cachedFunction = cache(someExpensiveMathematicalFunction);

The resulting function, which is stored in cachedFunction, can be executed just as the normal function.

cacheAsync(original, repackDeep = false)

cacheAsync expects its original function to always return a promise. Therefore, cacheAsync will always return an async function, which alwaysw returns a Promise.

import { cacheAsync } from '@opdime/cache';

const fetchFromApi = () => fetch('http://api.example.com/slow/');

const fetchCached = cacheAsync(fetchFromApi);

cacheAsyncWithTimeLimit(original, limit,repackDeep = false)

cacheAsyncWithTimeLimit works similar to cacheAsync. The main difference is, that it also expects a limit of seconds, after which a cached result is invalid. After the given time, the cached value will automatically be invalidated. So, the value for the passed parameters will be fetched by the original function again. The newly fetched value will then also be invalidted after the given time.

import { cacheAsyncWithTimeLimit } from '@opdime/cache';

const fetchFromApi = () => fetch('http://api.example.com/slow/');

// calling
const fetchCached = cacheAsyncWithTimeLimit(fetchFromApi, 20);