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

fictionary

v1.2.0

Published

Simple dictionary implemented as a flat object

Downloads

11

Readme

fictionary

npm package

Summary

Have you ever wanted to use a dictionary or hashmap in JavaScript or TypeScript? Well keep dreaming, but this module will let you pretend you have one!

The fake dictionary (HackMap) is implemented as an immutable, flat object with typed, generic accessors. This allows for easier debugging and serialization. Since it is immutable, all changes result in a new HackMap object. Additionally, it is available as a mutable class wrapped around the HackMap object, with accessor functions bound to the wrapper instance in the constructor.

Installation

via npm

> npm install fictionary

Motivation

When using Redux for complex apps, our team has run into the need for multiple hashmaps. We needed to be able to store objects and retrieve them quickly. We also wanted to use Redux's built-in serialization for things like ReduxDevTools. Since we are using TypeScript, we could place reasonable guards around flat objects and use them. This module is the result of our formalizing these guard functions for our entity objects in Redux.

Examples

Using methods with immutable flat objects

import * as f from "fictionary";

let map = f.emptyHackMap<string>();
// map is {}

map = f.setValue(map)("foo")("bar");
// map is { foo: "bar" }

const foo = f.getValue(map)("foo");
// -> "bar"

const willBeUndefined = f.getValue(map)("yarg");
// -> undefined

Using HackMapper for types which have a key

Some types lend themselves to storing in a map by a key, often an ID field. To facilitate this, there is a HackMapper interface, which uses a user-provided getKey function to extract the string key from objects.

Given a type like:

export type Book = {
  isbn: string;
  title: string;
  authorLastName: string;
};

a function to get the ISBN like

const getIsbn = (book: Book) => book.isbn;

can be used with a HackMapper<Book>

const bookMapper = f.createHackMapper(getIsbn);
let map = f.emptyHackMap<Book>();

map = bookMapper.setValue(map)({
  isbn: "9781974305032",
  title: "Moby Dick or The Whale",
  authorLastName: "Melville"
});

Compound keys

The key of an object does not have to be a single string field. Compound keys can created and used with HackMapper by using a getKey function which concats the required properties.

export type Organism = {
  genus: string;
  species: string;
  extint: boolean;
}

const getCompoundKey = (organism: Organism) => `${organism.genus} ${organism.species}`;

Contributing

Feel free to make a pull request if the spirit moves you.

This module was created by @not-mike-smith who barely-didn't-plagiarize code written by @TheWix