9个版本
0.2.6 | 2021年2月16日 |
---|---|
0.2.4 | 2021年2月3日 |
0.1.10 | 2021年2月2日 |
0.1.2 | 2021年1月29日 |
#914 in 文本处理
每月下载量 29次
43KB
1K SLoC
enum-ts
将此定义放置在您的项目中某个位置
/**
* This special type can help generate pattern matchers for you!
* Just use it as so:
*
* type Result<Ok, Err> = Enum<{
* Ok: Ok,
* Err: Err,
* }>
*/
export type Enum<T extends { [Variant: string]: any }> = {
[P in keyof T]: Record<P, T[P]>;
}[keyof T];
现在,每当您在文件根目录处(不能嵌套在其他块中)编写具有Enum
定义的类型时,enum-ts
将能够为您生成穷举模式匹配器和构造函数代码!
安装
这目前只是一个您可以通过编译通过cargo安装或通过npm安装来使用的可执行文件。
cargo install enum-ts
# build from source hosted on crates.io
npm install --global enum-ts-bin
# install from npm registry with npm
yarn global add enum-ts-bin
# install from npm registry with yarn
enum-ts --version
# print version
然后,您可以使用tests/
中的示例或本README中的示例进行测试
cat ./tests/result.ts | enum-ts
这将打印生成的枚举匹配辅助程序!
命令行界面
enum-ts
# no arguments puts enum-ts into pipe-mode
cat my-file.ts | enum-ts
# prints what would be generated from this file (mostly for debugging purposes)
enum-ts --write .
# recursively walks down the directory looking for *.ts & *.tsx files
# to write updates to directly
enum-ts .
# "dry-run" will only print out what it would have rewritten the files to if given the `--write` flag.
示例
结果
输入
type Result<O, E> = Enum<{
Ok: O;
Err: E;
}>;
生成
export type Ok<O, E> = O;
export type Err<O, E> = E;
export function Ok<O, E>(contents: Ok<O, E>): { Ok: Ok<O, E> } {
return { Ok: contents };
}
export function Err<O, E>(contents: Err<O, E>): { Err: Err<O, E> } {
return { Err: contents };
}
export function isOk<O, E>(item: Result<O, E>): item is { Ok: Ok<O, E> } {
return item != null && "Ok" in item;
}
export function isErr<O, E>(item: Result<O, E>): item is { Err: Err<O, E> } {
return item != null && "Err" in item;
}
export namespace Result {
const unexpected = "Unexpected Enum variant for Result<O, E>";
export function apply<O, E, R>(fns: {
Ok(content: Ok<O, E>): R;
Err(content: Err<O, E>): R;
}): (value: Result<O, E>) => R {
return function matchResultApply(item) {
return "Ok" in item
? fns.Ok(item.Ok)
: "Err" in item
? fns.Err(item.Err)
: (console.assert(false, unexpected, item) as never);
};
}
export function match<O, E, R>(
value: Result<O, E>,
fns: {
Ok(content: Ok<O, E>): R;
Err(content: Err<O, E>): R;
}
): R {
return apply(fns)(value);
}
}
用法
const res = Ok<string, any>("okay value");
Result.match(res, {
Ok(value) {
// do something with value
},
Err(err) {
// do something with err
},
});
if (isOk(res)) {
console.assert(res.Ok === "okay value");
}
二叉树<T>
输入
export type BinaryTree<T> = Enum<{
Leaf: T;
Branch: {
left: BinaryTree<T>;
right: BinaryTree<T>;
};
}>;
生成
export type Leaf<T> = T;
export type Branch<T> = {
left: BinaryTree<T>;
right: BinaryTree<T>;
};
export function Leaf<T>(contents: Leaf<T>): { Leaf: Leaf<T> } {
return { Leaf: contents };
}
export function Branch<T>(contents: Branch<T>): { Branch: Branch<T> } {
return { Branch: contents };
}
export function isLeaf<T>(item: BinaryTree<T>): item is { Leaf: Leaf<T> } {
return item != null && "Leaf" in item;
}
export function isBranch<T>(item: BinaryTree<T>): item is { Branch: Branch<T> } {
return item != null && "Branch" in item;
}
export namespace BinaryTree {
const unexpected = "Unexpected Enum variant for BinaryTree<T>";
export function apply<T, R>(fns: {
Leaf(content: Leaf<T>): R;
Branch(content: Branch<T>): R;
}): (value: BinaryTree<T>) => R {
return function matchBinaryTreeApply(item) {
return "Leaf" in item
? fns.Leaf(item.Leaf)
: "Branch" in item
? fns.Branch(item.Branch)
: (console.assert(false, unexpected, item) as never);
};
}
export function match<T, R>(
value: BinaryTree<T>,
fns: {
Leaf(content: Leaf<T>): R;
Branch(content: Branch<T>): R;
}
): R {
return apply(fns)(value);
}
}
开发
cargo install --path ./enum-ts
:在克隆仓库后本地安装
许可证
根据您的选择,在Apache许可证版本2.0或MIT许可证下授权。除非您明确表示,否则您有意提交给此crate的任何贡献,根据Apache-2.0许可证定义,应按上述方式双重授权,不附加任何其他条款或条件。
依赖项
~4–13MB
~133K SLoC