114

GitHub - tc39/proposal-pattern-matching: Pattern matching syntax for ECMAScript

 6 years ago
source link: https://github.com/tc39/proposal-pattern-matching
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

README.md

ECMAScript Pattern Matching

Status

Stage: 0

Author: Kat Marchán (npm, @maybekatz)

Champions: Brian Terlson (Microsoft, @bterlson), Sebastian Markbåge (Facebook, @sebmarkbage), Kat Marchán (npm, @maybekatz)

Introduction

This proposal adds a pattern matching expression to the language, based on the existing Destructuring Binding Patterns.

It's structured into multiple parts:

  • The core proposal for the match API, which is based directly on destructuring binding patterns.

  • A proposal extending both match and regular destructuring with as patterns, so patterns can both be matched and be assigned to identifiers.

  • A proposal to add tagged collection literals, both as construction literals, and as their corresponding destructuring patterns.

  • A document including suggestions for other future proposals, which are dependent on match, but do not directly affect the main behavior of the feature.

This proposal draws heavily from corresponding features in Rust, F#, Scala, and Elixir.

Motivating Examples

Matching fetch() responses:

const res = await fetch(jsonService)
const val = match (res) {
  {status: 200, headers: {'Content-Length': s}} => `size is ${s}`,
  {status: 404} => 'JSON not found',
  {status} if (status >= 400) => throw new RequestError(res)
}

Terser, more functional handling of Redux reducers. Compare with this same example in the Redux documentation:

function todoApp (state = initialState, action) {
  const newState = match (action) {
    {type: 'set-visibility-filter', filter: visFilter} => ({visFilter}),

    {type: 'add-todo', text} => ({
      todos: [...state.todos, {text}]
    }),

    {type: 'toggle-todo', index} => ({
      todos: state.todos.map((todo, idx) => idx === index
        ? {...todo, done: !todo.done}
        : todo
      )
    }),

    {} => null // ignore unknown actions
  }

  return {...state, ...newState}
}

Or mixed in with JSX code for quick props handling:

<Fetch url={API_URL}>{
  props => match (props) {
    {loading} => <Loading />,
    {error} => <Error error={error} />,
    {data} => <Page data={data} />
  }
}
</Fetch>

(via Divjot Singh)

General structural duck-typing on an API for vector-likes:

const getLength = vector => match (vector) {
  { x, y, z } => Math.sqrt(x ** 2 + y ** 2 + z ** 2),
  { x, y } => Math.sqrt(x ** 2 + y ** 2),
  [...etc] => vector.length
}
getLength({x: 1, y: 2, z: 3}) // 3.74165

Implementations


Recommend

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK