GitHub - iptop/babel-plugin-proposal-pattern-matching: the minimal grammar, high performance JavaScript pattern matching implementation (original) (raw)
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