Skip to content

Latest commit

 

History

History
90 lines (77 loc) · 1.61 KB

README.md

File metadata and controls

90 lines (77 loc) · 1.61 KB

μExpr

A conditional expression compiler (MIT Licensed)


Introduction

μExpr is a compiler for conditional expressions and filters/matchers that can be stored in JSON. It is similar in purpose to https://jsonlogic.com/ with the following differences:

  1. Simplified syntax, without objects
  2. Reduced scope that focuses on matching (emitting either true or false)
  3. Attains native (25x faster) runtime performance by using new Function() with carefully placed guards

Example

import {
  compileExpr,
  compileMatcher,
  compileFilter
} from "../src/uExpr.mjs";

let matcher = compileMatcher(
  ['||',
    ['^', '.name', 'foo'],
    ['&&',
      ['==', '.meta.dataTopic', 'unsubscribe'],
      ['some', '.fields', ['==', '.type', 'string']]
    ],
  ]
);

If you were to write this logic by hand it would look like this:

let matcher = ($, $i = 0) => (
  $.name.startsWith("foo") ||
  (
    $.meta.dataTopic == "unsubscribe" &&
    $.fields.some(($, $i) => $.type == "string")
  )
);

Now you can use the compiled function as the callback to Array.filter():

let frames = [
  {
    name: 'foobar',
    meta: {
      dataTopic: 'subscribe'
    },
    fields: [
      {
        type: 'number'
      },
    ]
  },
  {
    name: 'something',
    meta: {
      dataTopic: 'unsubscribe'
    },
    fields: [
      {
        type: 'string'
      },
    ]
  },
  {
    name: 'other',
    meta: {
      dataTopic: 'cancellation'
    },
    fields: [
      {
        type: 'string'
      },
    ]
  },
];

let filtered = frames.filter(matcher);