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

@richlewis42/callable

v0.2.1

Published

Callable instances for JS

Downloads

4

Readme

@richlewis42/callable npm-version

Callable instances for JS, in under 10 lines of ES6!

Motivation

Anything class be a function in Python simply by implementing a __call__ method.

For example,

class ImaFunc(object):
  def __init__(self, a):
    super()
    self.a = a

  @property
  def b(self):
    return self.a + 10

  def __call__(self, c):
  return [self.a, self.b, c]

f = ImaFunc(10)
f(30)                  # [10, 20, 30]

This can be really useful: the callable method has access to the member attributes and properties, so we can change how the function behaves post instatiation:

f.a = 40
f(60)                  # [40, 50, 60]

Additionally, the instance works with the class hierarchy nicely:

isinstance(f, ImaFunc) # True
isinstance(f, object)  # True
callable(f)            # True

However, in JavaScript, this is not so straightforward... until now!!

Install

For node:

npm install @richlewis/callable

For the browser, you can include a script tag to pull the library from unpkg:

<script
  type="text/javascript"
  src="https://unpkg.com/@richlewis/callable"
></script>

Usage

Inherit from the default export of this library, Callable:

class ImaFunc extends Callable {
  constructor(a) {
    super()
    this.a = a
  }

  get b() {
    return this.a + 10
  }

  __call__(c) {
    return [this.a, this.b, c]
  }
}

const f = new ImaFunc(10)
f(30) // [10, 20, 30]

f instanceof ImaFunc // true
f instanceof Callable // true
f instanceof Object // true
f instanceof Function // true

Now you can do some func-y tricks:

class SubFunc extends ImaFunc {
  constructor(a, d) {
    super(a)
    this.d = d
  }

  get e() {
    return this.d + 10
  }

  __call__(c, f) {
    return [...super.__call__(c), this.d, this.e, f]
  }
}

new SubFunc(10, 40)(30, 60) // [10, 20, 30, 40, 50, 60]

How does it work?

Callable hijacks the constructor, returning a function that executes the __call__ function bound to itself. This function gets the prototype and member properties from the this object, and thus the inheritance chain is repaired!

Prior Art

Other libraries that present similar functionality:

License

MIT @ Rich Lewis