包详细信息

if-match

buwon34MIT1.0.3

Allows if-else to be used as a lambdba expression.

自述文件

if-match

A simple if-else improvement library. Inspired by the ts-pattern module

import { match } from 'if-match';

// as is
let gameName = '';
if (game.genre === 'rpg') {
  if (game.company === 'enix') {
    gameName = 'dq1';
  } else if (game.company === 'nintendo') {
    gameName = 'pokemon';
  }
  gameName = 'ff1';
} else if (game.genre === 'simulation') {
  if (game.company === 'maxis') {
    gameName = 'simcity';
  }
}

// as is
const gameName2 = (() => {
  if (game.genre === 'rpg') {
    if (game.company === 'enix') {
      return 'dq1';
    } else if (game.company === 'nintendo') {
      return 'pokemon';
    }
    return 'ff1';
  } else if (game.genre === 'simulation') {
    if (game.company === 'maxis') {
      return 'simcity';
    }
    return '';
  }
  return '';
})();

// to be
const gameName3 = match(game)
  .when({ genre: 'rpg', company: 'enix' }, 'dq1')
  .when({ genre: 'rpg', company: 'nintendo' }, 'pokemon')
  .when({ genre: 'rpg' }, 'ff1')
  .when({ genre: 'simulation', company: 'maxis' }, 'simcity')
  .otherwise('simcity');

About

Complicated conditions have been combined into one compact expression. Your code becomes shorter and more readable. Exhaustiveness checking ensures you haven’t forgotten any possible case. You can only use const without using let.

Features

  • It works at high speed without complicated and unnecessary processing.
  • Extend functionality using functions

Installation

Via npm

npm install if-match

Via deno

import { match } from 'https://deno.land/x/if_match/mod.ts';

Documentation

Getting Started

API Reference

match

match(value);

Create a Match object on which you can later call .when, .otherwise, .exhaustive and .run.

Example

match(3).run();
match([1, 2, 3]).run();
match({ hello: 'world' }).run();

Arguments

  • value
    • Required
    • Input values to be tested.

.when

match(...)
  .when(predicate, handler)

Example

// return 4
match(3).when(3, 4).run();
match(3).when(3, (v) => v + 1).run();

// return 3
match([1, 2, 3]).when([1, 2, 3], 3).run();
match([1, 2, 3]).when([1, 2, 3], (v) => v.length).run();

// return true
match({ hello: 'world' }).when({ hello: 'world' }, true).run();
match({ hello: 'world' }).when((v) => (v.hello === 'world'), true).run();

Arguments

  • predicate: T | (value: T) => boolean
    • Required
    • Comparison Value or Comparison Function.
  • handler: any | (value: T) => any
    • Required
    • A function or return value that is called when a predicate condition is met.

.otherwise

match(...)
  .when(...)
  .otherwise(defaultHandler)

Equivalent to else. If no .when() is matched, .otherwise() is called.

Example

match(1).otherwise('Hello World'); // return 'Hello World'
match(1).otherwise(() => true); // return true
match(1).otherwise((v) => v + 1); // return 2

Arguments

  • defaultHandler: any | (value: T) => any
    • Required
    • Called if no '.when()' matches.
    • Think of it as the default: case of switch statements.

.exhaustive

match(...)
  .when(...)
  .exhaustive()

Used when there is no else or otherwise. Returns null if it does not match any '.when()'.

Example

match(1).exhaustive(); // return null
match(1).when(1, true).exhaustive(); // return true

Arguments

  • no arguments

.run

match(...)
  .when(...)
  .run()

Equivalent to .exhaustive.

Example

match(1).run(); // return null
match(1).when(1, true).run(); // return true

Arguments

  • no arguments