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');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.
- It works at high speed without complicated and unnecessary processing.
- Extend functionality using functions
Via npm
npm install if-matchVia deno
import { match } from 'https://deno.land/x/if_match/mod.ts';match(value);Create a Match object on which you can later call .when, .otherwise, .exhaustive and .run.
match(3).run();
match([1, 2, 3]).run();
match({ hello: 'world' }).run();value- Required
- Input values to be tested.
match(...)
.when(predicate, handler)// 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();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.
match(...)
.when(...)
.otherwise(defaultHandler)Equivalent to else. If no .when() is matched, .otherwise() is called.
match(1).otherwise('Hello World'); // return 'Hello World'
match(1).otherwise(() => true); // return true
match(1).otherwise((v) => v + 1); // return 2defaultHandler: any | (value: T) => any- Required
- Called if no '.when()' matches.
- Think of it as the
default:case ofswitchstatements.
match(...)
.when(...)
.exhaustive()Used when there is no else or otherwise.
Returns null if it does not match any '.when()'.
match(1).exhaustive(); // return null
match(1).when(1, true).exhaustive(); // return true- no arguments
match(...)
.when(...)
.run()Equivalent to .exhaustive.
match(1).run(); // return null
match(1).when(1, true).run(); // return true- no arguments