frontpage.
newsnewestaskshowjobs

Made with ♥ by @iamnishanth

Open Source @Github

fp.

Open in hackernews

JavaScript helper function for you to use

4•EGreg•7mo ago
Got a function that fetches some values asynchronously from somewhere? Consider wrapping it in this and making it a super-function.

Here is what it does for all the functions you wrap with it. In my experience, these are very helpful and also gives you a place you can even hook into and add more later (such as handling batching transparencly, etc):

Memoizes async getters: Call a function with the same arguments and it returns the cached result instead of recomputing.

Handles in-flight deduping: If multiple parts of your app call the same getter while it's still working, only one request is sent. The rest wait on the same promise.

Throttles concurrency: You can limit how many calls to your getter run in parallel. Useful for APIs, disk I/O, or anything rate-sensitive.

Supports custom caching backends: Pass any object with get, set, delete, and has. Works with Map, LRU, or your own cache logic.

Optional LRU eviction: If you pass a plain Map, it upgrades it to an LRU with a max size. Least recently used items are evicted when full.

Handles callbacks and Promises: Wraps traditional callback-style async functions, but gives you a modern Promise-based interface.

Smart-ish keying: Builds a cache key by stringifying non-function arguments. Works well for most everyday use cases.

Supports manual eviction: Call getter.forget(...args) to remove specific entries or getter.force(...args) to bypass the cache for one call.

Allows custom preparation logic: You can pass a prepare() function to clone or process cached results before using them.

  function createGetter(fn, {
    cache = new Map(),
    cacheSize = 100, // Used only if cache is a Map
    throttleSize = Infinity,
    prepare,
    callbackIndex,
    resolveWithFirstArgument = false
  } = {}) {
    const inFlight = new Map();
    let activeCount = 0;
    const queue = [];
  
    // Wrap Map in a simple LRU if needed
    if (cache instanceof Map) {
      const rawMap = cache;
      const lru = new Map();
  
      cache = {
        get(key) {
          if (!rawMap.has(key)) return undefined;
          const value = rawMap.get(key);
          lru.delete(key);
          lru.set(key, true); // Mark as most recently used
          return value;
        },
        set(key, value) {
          rawMap.set(key, value);
          lru.set(key, true);
          if (rawMap.size > cacheSize) {
            const oldest = lru.keys().next().value;
            rawMap.delete(oldest);
            lru.delete(oldest);
          }
        },
        delete(key) {
          rawMap.delete(key);
          lru.delete(key);
        },
        has(key) {
          return rawMap.has(key);
        }
      };
    }
  
    function makeKey(args) {
      return JSON.stringify(args.map(arg => (typeof arg === 'function' ? 'ƒ' : arg)));
    }
  
    function execute(context, args, key, resolve, reject) {
      const callback = (err, result) => {
        if (err) return reject(err);
        cache.set(key, [context, arguments]);
        if (prepare) prepare.call(null, context, arguments);
        resolve(resolveWithFirstArgument && context !== undefined ? context : result);
        processNext();
      };
  
      if (callbackIndex != null) args.splice(callbackIndex, 0, callback);
      else args.push(callback);
  
      if (fn.apply(context, args) === false) {
        cache.delete(key); // opt-out of cache
      }
    }
  
    function processNext() {
      activeCount--;
      if (queue.length && activeCount < throttleSize) {
        const next = queue.shift();
        activeCount++;
        execute(...next);
      }
    }
  
    const getter = function (...args) {
      return new Promise((resolve, reject) => {
        const context = this;
        const key = makeKey(args);
  
        if (cache.has(key)) {
          const [cachedContext, cachedArgs] = cache.get(key);
          if (prepare) prepare.call(null, cachedContext, cachedArgs);
          return resolve(resolveWithFirstArgument && cachedContext !== undefined ? cachedContext : cachedArgs[1]);
        }
  
        if (inFlight.has(key)) {
          return inFlight.get(key).then(resolve, reject);
        }
  
        const promise = new Promise((res, rej) => {
          if (activeCount < throttleSize) {
            activeCount++;
            execute(context, args.slice(), key, res, rej);
          } else {
            queue.push([context, args.slice(), key, res, rej]);
          }
        });
  
        inFlight.set(key, promise);
        promise.finally(() => {
          inFlight.delete(key);
        });
  
        promise.then(resolve, reject);
      });
    };
  
    getter.forget = (...args) => {
      const key = makeKey(args);
      inFlight.delete(key);
      return cache.delete(key);
    };
  
    getter.force = function (...args) {
      getter.forget(...args);
      return getter.apply(this, args);
    };
  
    return getter;
  }

You Are Here

https://brooker.co.za/blog/2026/02/07/you-are-here.html
1•mltvc•2m ago•0 comments

Why social apps need to become proactive, not reactive

https://www.heyflare.app/blog/from-reactive-to-proactive-how-ai-agents-will-reshape-social-apps
1•JoanMDuarte•3m ago•0 comments

How patient are AI scrapers, anyway? – Random Thoughts

https://lars.ingebrigtsen.no/2026/02/07/how-patient-are-ai-scrapers-anyway/
1•samtrack2019•4m ago•0 comments

Vouch: A contributor trust management system

https://github.com/mitchellh/vouch
1•SchwKatze•4m ago•0 comments

I built a terminal monitoring app and custom firmware for a clock with Claude

https://duggan.ie/posts/i-built-a-terminal-monitoring-app-and-custom-firmware-for-a-desktop-clock...
1•duggan•5m ago•0 comments

Tiny C Compiler

https://bellard.org/tcc/
1•guerrilla•6m ago•0 comments

Y Combinator Founder Organizes 'March for Billionaires'

https://mlq.ai/news/ai-startup-founder-organizes-march-for-billionaires-protest-against-californi...
1•hidden80•7m ago•1 comments

Ask HN: Need feedback on the idea I'm working on

1•Yogender78•7m ago•0 comments

OpenClaw Addresses Security Risks

https://thebiggish.com/news/openclaw-s-security-flaws-expose-enterprise-risk-22-of-deployments-un...
1•vedantnair•7m ago•0 comments

Apple finalizes Gemini / Siri deal

https://www.engadget.com/ai/apple-reportedly-plans-to-reveal-its-gemini-powered-siri-in-february-...
1•vedantnair•8m ago•0 comments

Italy Railways Sabotaged

https://www.bbc.co.uk/news/articles/czr4rx04xjpo
2•vedantnair•8m ago•0 comments

Emacs-tramp-RPC: high-performance TRAMP back end using MsgPack-RPC

https://github.com/ArthurHeymans/emacs-tramp-rpc
1•fanf2•10m ago•0 comments

Nintendo Wii Themed Portfolio

https://akiraux.vercel.app/
1•s4074433•14m ago•1 comments

"There must be something like the opposite of suicide "

https://post.substack.com/p/there-must-be-something-like-the
1•rbanffy•16m ago•0 comments

Ask HN: Why doesn't Netflix add a “Theater Mode” that recreates the worst parts?

2•amichail•17m ago•0 comments

Show HN: Engineering Perception with Combinatorial Memetics

1•alan_sass•23m ago•2 comments

Show HN: Steam Daily – A Wordle-like daily puzzle game for Steam fans

https://steamdaily.xyz
1•itshellboy•25m ago•0 comments

The Anthropic Hive Mind

https://steve-yegge.medium.com/the-anthropic-hive-mind-d01f768f3d7b
1•spenvo•25m ago•0 comments

Just Started Using AmpCode

https://intelligenttools.co/blog/ampcode-multi-agent-production
1•BojanTomic•27m ago•0 comments

LLM as an Engineer vs. a Founder?

1•dm03514•27m ago•0 comments

Crosstalk inside cells helps pathogens evade drugs, study finds

https://phys.org/news/2026-01-crosstalk-cells-pathogens-evade-drugs.html
2•PaulHoule•28m ago•0 comments

Show HN: Design system generator (mood to CSS in <1 second)

https://huesly.app
1•egeuysall•29m ago•1 comments

Show HN: 26/02/26 – 5 songs in a day

https://playingwith.variousbits.net/saturday
1•dmje•29m ago•0 comments

Toroidal Logit Bias – Reduce LLM hallucinations 40% with no fine-tuning

https://github.com/Paraxiom/topological-coherence
1•slye514•32m ago•1 comments

Top AI models fail at >96% of tasks

https://www.zdnet.com/article/ai-failed-test-on-remote-freelance-jobs/
5•codexon•32m ago•2 comments

The Science of the Perfect Second (2023)

https://harpers.org/archive/2023/04/the-science-of-the-perfect-second/
1•NaOH•33m ago•0 comments

Bob Beck (OpenBSD) on why vi should stay vi (2006)

https://marc.info/?l=openbsd-misc&m=115820462402673&w=2
2•birdculture•36m ago•0 comments

Show HN: a glimpse into the future of eye tracking for multi-agent use

https://github.com/dchrty/glimpsh
1•dochrty•37m ago•0 comments

The Optima-l Situation: A deep dive into the classic humanist sans-serif

https://micahblachman.beehiiv.com/p/the-optima-l-situation
2•subdomain•38m ago•1 comments

Barn Owls Know When to Wait

https://blog.typeobject.com/posts/2026-barn-owls-know-when-to-wait/
1•fintler•38m ago•0 comments