GitHub - iptop/babel-plugin-proposal-pattern-matching: the minimal grammar, high performance JavaScript pattern matching implementation (original) (raw)

avatar

中文文档

Installation

With npm:

npm install --save-dev babel-plugin-proposal-pattern-matching

Setup

.babelrc

{ "plugins": ["babel-plugin-proposal-pattern-matching"] }

Example

easy

import match from 'babel-plugin-proposal-pattern-matching/match' const fib = n=>match(n)( (v=1)=>1, (v=2)=>1, =>fib(-1)+fib(_-2) )

console.log(fib(10)) // -> 55

fnmatch

import match from 'babel-plugin-proposal-pattern-matching/match' const fib = fnmatch( (v = 1) => 1, (v = 2) => 1, _ => fib(_ - 1) + fib(_ - 2) )

console.log(fib(10))

// -> 55

const arr = [1, 2, 3]

console.log( arr.map( fnmatch( (v = 1) => 'one', (v = 2) => 'two', (v = 3) => 'three' ) ) )

// -> [ 'one', 'two', 'three' ]

type

import { match , T} from 'babel-plugin-proposal-pattern-matching/match'

const getType = item => match(item)( (v = T.number) => 'number', (v = T.string) => 'string', (v = T.nullish) => 'nullish', _ => ${_} undefined type )

console.log(getType('a')) // -> string

console.log(getType(1)) // -> number

console.log(getType(undefined)) // -> nullish

console.log(getType(null)) // -> nullish

instanceOf

import { match, instanceOf } from 'babel-plugin-proposal-pattern-matching/match'

const getType = val => match(val)( (v=instanceOf(RegExp))=>'RegExp', (v=instanceOf(Array))=>'Array', (v=instanceOf(Object))=>'Object', )

console.log(getType(/111/)) // -> RegExp console.log(getType([1,2,3])) // -> Array console.log(getType({a:1})) // -> Object

deconstruction

import { match } from 'babel-plugin-proposal-pattern-matching/match' const sum = x => match(x)( ([x, ...xs]) => x + sum(xs), ([]) => 0 )

console.log(sum([1, 2, 3])) // -> 6

for (let i = 1; i <= 15; i++) { console.log( match({a: i % 3, b: i % 5})( ({a = 0, b = 0}) => 'FizzBuzz', ({a = 0, b}) => 'Fizz', ({a, b = 0}) => 'Buzz', _ => i ) ) } // -> // 1 // 2 // Fizz // 4 // Buzz // Fizz // 7 // 8 // Fizz // Buzz // 11 // Fizz // 13 // 14 // FizzBuzz

not

import { match, not, or, T } from 'babel-plugin-proposal-pattern-matching/match'

const toNumber = n => match(n)( (v = not(T.boolean)) => v, (v = true) => 1, (v = false) => 0 )

console.log( [true, false, 0, 1, 2, 3].map(toNumber) ) // -> [ 1, 0, 0, 1, 2, 3 ]

or

import { match, or } from 'babel-plugin-proposal-pattern-matching/match' const fib = n => match(n)( (v = or(1, 2)) => 1, _ => fib(_ - 1) + fib(_ - 2) )

console.log(fib(10)) // -> 55

and

import { match, and, not } from 'babel-plugin-proposal-pattern-matching/match' const fib = n => match(n)( (_ = and(not(1), not(2))) => fib(_ - 1) + fib(_ - 2), _ => 1 )

console.log(fib(10)) // -> 55

LICENSE

MIT