react-match-case
TypeScript icon, indicating that this package has built-in type declarations

0.1.0 • Public • Published

react-match-case

Components allowing you to use pattern matching in react, without any hassle.

This package uses package matchto (link: https://www.npmjs.com/package/matchto). For matchto utility functions, import { utils } from package.

Example (from unit tests)

 
const rendered = renderer.create(
    <Match item="Hello world" kind="all">
        <Case pattern={/^Hello/}>
            1{" "}
        </Case>
        <Case pattern="Nope">
            2{" "}
        </Case>
        <Case pattern="Hello world">
            3
        </Case>
    </Match>
);
expect(rendered.toJSON()?.toString()).toBe("1, ,3");
 

Example of delayed evaluation (useful for null checks)

 
const arrays = [
    [1, 2, 3],
    null,
];
const rendered = renderer.create(
    <>
        <Match item={arrays[0]}>
            <Case pattern={null}>
                null
            </Case>
            <Case pattern={[]}>
                {() => arrays[0]!.length}
            </Case>
        </Match>
        <Match item={arrays[1]}>
            <Case pattern={null}>
                null
            </Case>
            <Case pattern={[]}>
                {() => arrays[1]!.length}
            </Case>
        </Match>
    </>
);
expect(rendered.toJSON()?.toString()).toBe("3,null");
 

Example of one-line pattern matching using Pattern component

 
const rendered = renderer.create(
    <>
        <Pattern item="Hello world" to={/^Hello/}>
            1{" "}
        </Pattern>
        <Pattern item="Hello world" to="Nope">
            2{" "}
        </Pattern>
        <Pattern item="Hello world" to="Hello world">
            3
        </Pattern>
    </>
);
expect(rendered.toJSON()?.toString()).toBe("1, ,3");
 

Example of using prolog-like cut (if one case is true don't evaluate the rest)

 
const rendered = renderer.create(
    <Match item={{ a: 5, b: 10 }} kind="all">
        <Case pattern={{ a: 5, b: 10 }} cut>
            1{" "}
        </Case>
        <Case pattern={{ a: 5 }}>
            2{" "}
        </Case>
    </Match>
);
expect(rendered.toJSON()?.toString()).toBe("1, ");
 

Example of end-tail recursion with exact match (two objects exact equality)

 
const rendered = renderer.create(
    <Match item={[1, 2, 3, 4]}>
        <Case pattern={[]} exact></Case>
        <Case pattern={[utils.Any]} rematch={item => item.slice(1)}>
            {(items: number[]) => items[0]}
        </Case>
    </Match>
);
expect(rendered.toJSON()?.toString()).toBe("1,2,3,4");
 

Example of using negation

 
const rendered = renderer.create(
    <Match item="Hello world">
        <Case pattern={Number} not>
            1{" "}
        </Case>
        <Case pattern={String} not>
            2{" "}
        </Case>
    </Match>
);
expect(rendered.toJSON()?.toString()).toBe("1, ");
 

Example of guard conditions

 
const rendered = renderer.create(
    <Match item="Hello world">
        <Case pattern={String} guard={s => s.length > 5}>
            1{" "}
        </Case>
        <Case pattern={String} guard={s => s.length <= 5}>
            2{" "}
        </Case>
    </Match>
);
expect(rendered.toJSON()?.toString()).toBe("1, ");
 

Footer

If you have any ideas on how to improve this package, or have discovered any bugs, please fill out an issue or pull request.

Package Sidebar

Install

npm i react-match-case

Weekly Downloads

2

Version

0.1.0

License

MIT

Unpacked Size

20.8 kB

Total Files

12

Last publish

Collaborators

  • jindra12