Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/z-pattern-matching/z
Pattern Matching for Javascript
https://github.com/z-pattern-matching/z
functional-programming immutability pattern-matching
Last synced: 2 days ago
JSON representation
Pattern Matching for Javascript
- Host: GitHub
- URL: https://github.com/z-pattern-matching/z
- Owner: z-pattern-matching
- License: apache-2.0
- Created: 2015-09-01T14:37:18.000Z (over 9 years ago)
- Default Branch: master
- Last Pushed: 2023-10-28T18:22:35.000Z (about 1 year ago)
- Last Synced: 2025-01-17T01:05:28.923Z (9 days ago)
- Topics: functional-programming, immutability, pattern-matching
- Language: JavaScript
- Homepage: https://z-pattern-matching.github.io/
- Size: 509 KB
- Stars: 1,718
- Watchers: 23
- Forks: 50
- Open Issues: 23
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- awesome - z - Pattern Matching for Javascript (JavaScript)
- my-awesome-list - z - pattern-matching | 1719 | (JavaScript)
- awesome-list - z - pattern-matching | 1674 | (JavaScript)
README
# ![z](https://raw.githubusercontent.com/leonardiwagner/z/master/z-logo.png) Pattern matching for JavaScript
[![Build Status](https://travis-ci.org/z-pattern-matching/z.svg?branch=master)](https://travis-ci.org/z-pattern-matching/z)
[![Coverage Status](https://coveralls.io/repos/github/z-pattern-matching/z/badge.svg?branch=master)](https://coveralls.io/github/z-pattern-matching/z?branch=master)
[![NPM version](https://img.shields.io/npm/v/z.svg)](https://www.npmjs.com/package/z)### Usage
- Install via npm: `npm install z`
- Require z in your code and use the matches function: `const { matches } = require('z')`### Avaiable Patterns
- Matches by value: `(x = 1) =>, (x = null) =>, (x = 'true') =>`
- Matches by object or array: `(x = {a: 1}) =>, (x = [1, 2]) =>`
- Matches by type: `(x = String) =>, (x = Boolean) =>`
- Matches by instance: `(x = Date) =>, (x = Person) =>`
- Matches by splitting array into elements and tail `(head, tail) =>` , `(a, b, c, tail) =>`, etc…### Examples
- **Example:** Matches by Object property
```javascript
const { matches } = require('z')const person = { name: 'Maria' }
matches(person)(
(x = { name: 'John' }) => console.log('John you are not welcome!'),
(x) => console.log(`Hey ${x.name}, you are welcome!`)
)//output: `Hey Maria, you are welcome!`
```- **Example:** Matches by type or instances
```javascript
const { matches } = require('z')const result = matches(1)(
(x = 2) => 'number 2 is the best!!!',
(x = Number) => `number ${x} is not that good`,
(x = Date) => 'blaa.. dates are awful!'
)console.log(result) // output: number 1 is not that good
```- **Example:** matches Array content
> To match array content you need create multiple arguments for the match function, such as (a, b, c, tail) => {} , then each variable match each item from array. Note: last variable contains all remaining array items, formally named tail. Examples:
```javascript
const { matches } = require('z')matches([1, 2, 3, 4, 5])(
(a, b, c, tail) => 'a = 1, b = 2, c = 3, tail = [4, 5]'
)matches([1, 2])(
(a, tail) => 'a = 1, b = [2]'
)matches([1])(
(a, b, tail) => 'Will not match here',
(a = 2, tail = []) => 'Will not match here',
(a = 1, tail = []) => 'Will match here, tail = []'
)
```- **Example:** Powerful recursive code which will remove sequential repeated items from Array.
> Can be mind blowing if it’s the first time you meet pattern matching, but you are gonna understand it!
```javascript
const { matches } = require('z')const compress = (numbers) => {
return matches(numbers)(
(x, y, xs) => x === y
? compress([x].concat(xs))
: [x].concat(compress([y].concat(xs))),
(x, [y]) => x === y // stopping condition
? [x]
: [x, y],
x => x
)
}compress([1, 1, 2, 3, 4, 4, 4]) //output: [1, 2, 3, 4]
```### License
[Apache 2.0][apache-license]
[apache-license]:./LICENSE