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

hyper-function

v1.0.1

Published

Named Parameters and Overloadable Function for JavaScript

Downloads

1

Readme

hyper-functionについて

hyper-functionはJavaScriptで(擬似的に?)名前付き引数とオーバーロード可能な関数を利用するためのライブラリです。

インストール

# NPM
npm install hyper-function
# yarn
yarn add hyper-function

使い方

import

hyper-functionはES6のimportで読み込むことができます。

import hyper from 'hyper-function'

hyper-functionだと名前が長いのでhyperとしてインポートしています。

関数の定義

関数を定義するには

const func = hyper([
  {
    引数1: 型,
    引数2: 型,
    引数3: 型,
    引数...: 型,
    _({ 引数1, 引数2, 引数3, 引数... }) { /*処理*/ },
  },
  {
    引数1: 型,
    引数2: 型,
    引数3: 型,
    引数4: 型,
    引数...: 型,
    _({ 引数1, 引数2, 引数3, 引数4, 引数... }) { /*処理*/ },
  },
])

このように記述します。

型についてはJavaScriptのプリミティブ型のみ対応しています。

現在自作型(クラス)とAny型(なんでも対応できる型)を開発しています。

デモと解説

Vec2 - 基本的なオーバーロードの使い方

const Vec2 = hyper([
  {
    x: Number,
    y: Number,
    _({ x, y }) {
      return { x, y }
    }
  },
  {
    xy: Number,
    _({ xy }, call) {
      return call(xy, xy)
    }
  },
  {
    _(call) {
      return call(0)
    }
  }
])

Vec2関数は3つのパターンがあります。

  1. x, yを受け取り{x, y}を返すパターン
  2. xyを受け取り{x: xy, y: xy}を返すパターン
  3. 何も受け取らずに{x: 0, y: 0}を返すパターン

それぞれ

//x, yを受け取り{x, y}を返すパターン
Vec2(10, 20)
//=>{x: 10, y: 20}

//xyを受け取り{x: xy, y: xy}を返すパターン
Vec2(32)
//=>{x: 32, y: 32}

//何も受け取らずに{x: 0, y: 0}を返すパターン
Vec2()
//=>{x: 0, y: 0}

このように使えます。

1つめのx, yを受け取り{x, y}を返すパターンの実装は

{
  x: Number,
  y: Number,
  _({ x, y }) {
    return { x, y }
  }
},

このようになっています。

最初の

x: Number,
y: Number,

で引数を定義します。この場合だとNumber型のxNumber型のyを定義しています。

次の

_({ x, y }) {
  return { x, y }
}

これはこのパターンの処理部分です。 必ずパターンの処理関数の名前は_にしてください。

引数の_({ x, y })は先程のNumber型のxNumber型のyに対応しています。

なお

_({ x, y }) {
  return { x, y }
}

_(data) {
  return { x: data.x, y: data.y }
}
と書き換えれます。

2つめのxyを受け取り{x: xy, y: xy}を返すパターンの実装は

{
  xy: Number,
  _({ xy }, call) {
    return call(xy, xy)
  }
},

このようになっています。

引数はNumber型のxyのみです。

処理部分は

_({ xy }, call) {
  return call(xy, xy)
}

このようになっています。

先程のパターンとは違い、第二引数にcallという引数があります。 そしてreturn call(xy, xy)を返しています。

これは先程のパターン(x, yを受け取り{x, y}を返すパターン)のを呼び出しています。

何も受け取らずに{x: 0, y: 0}を返すパターンの実装は

{
  _(call) {
    return call(0)
  }
}

引数が空の場合はいきなり第一引数でcallを受け取れます。 ちなみにこのcall(0)は先程の引数がxyだけのパターンを呼び出しています。

Human - 名前付き引数の使い方

人の情報を返すHuman関数があるとします。

Human関数は名字と名前と生まれた月と日を受け取ります。

実装は以下のとおりです。

const Human = hyper([
  {
    FirstName: String,
    LastName: String,
    BirthdayMonth: Number,
    BirthdayDay: Number,
    _({ FirstName, LastName, BirthdayMonth, BirthdayDay }) {
      return {
        FirstName,
        LastName,
        BirthdayMonth,
        BirthdayDay
      }
    }
  }
])

使用例:

Human('Taro', 'Yamada', 4, 6)

この例だけ見ると名前がYamada Taroということは分かるのですが、次の4, 64月6日なのか6月4日なのかはっきりしません。

そんなときに*名前付き引数(NamedParameter)*が役立ちます。

NamedParameterを使うにはhyper-functionをimportする部分を以下のようにします。

import hyper, { NamedParameter as Np } from 'hyper-function'

先程の例を名前付き引数で呼び出してみます。

Human(Np.Firstname = 'Taro', Np.Lastname = 'Yamada', Np.BirthdayMonth = 4, Np.BirthdayDay = 6)
//=> {FirstName: "Taro", LastName: "Yamada", BirthdayMonth: 4, BirthdayDay: 6}

このように

Np.引数名 = 値

で引数を渡しています。

といっても最初のTaroYamadaはどんな意味なのかは分かるので生まれた月と日だけ名前付き引数で渡すと

Human('Taro', 'Yamada', Np.BirthdayMonth = 4, Np.BirthdayDay = 6)
//=> {FirstName: "Taro", LastName: "Yamada", BirthdayMonth: 4, BirthdayDay: 6}

こんなかんじです。 だいぶ見やすいと思いませんか?

ちなみに名前付き引数は順番を変えても正常に動作します。

// BirthdayMonthとBirthdayDayの一を入れ替えた
Human('Taro', 'Yamada', Np.BirthdayDay = 6, Np.BirthdayMonth = 4)
//=> {FirstName: "Taro", LastName: "Yamada", BirthdayMonth: 4, BirthdayDay: 6}

デフォルト値

引数にはデフォルト値を付けれます。

通常引数を定義するときは

引数名:型

ですが 引数のデフォルト値を付けるには

引数名: {
  type: 型,
  default: () => デフォルト値
}

のように記述します。