概要
先日自作したsr-enumというnpmパッケージの紹介になります。sr-enumはJavaScriptで列挙体を扱うためのパッケージで、2019年7月からnpmに公開しています。
何が便利なのか
状態の管理が楽になると思います。
例
トークンの有効性を検証する
未検証Unverified
・検証中Verifying
・有効Valid
・無効Invalid
の3状態をとるTokenクラスを作成して、トークンの状態に応じて処理を分ける場合を考えます。
const Token = new Enum("Unverified", "Verifying", "Valid", "Invalid");
変数token
に未検証Unverified
なトークンを代入します。
let token = new Token.Unverified("トークン");
token
に未検証Unverified
なトークンが代入されている場合、トークンの有効性を検証します。
// トークンが未検証な場合、onTokenIsUnverifiedを呼び出す
token = match(token) ({
Unverified: onTokenIsUnverified,
default: token
});
function onTokenIsUnverified( unverifiedToken ) {
// トークンが未検証な場合の処理
// 何らかの非同期な検証処理
verifyToken( unverifiedToken )
.then( validToken => { token = new Token.Valid( validToken ) } )
.catch( invalidToken => { token = new Token.Invalid ( invalidToken ) };
// 検証中トークンを返す
return new Token.Verifying( unverifiedToken );
}
コンテンツを非同期で読み込む
あるコンテンツを非同期で読み込むときに、読み込みが完了しているのかどうかを判定するために、読み込み中Loading
・読み込み済みLoaded
の2状態を取る列挙体を考えます。
const Content = new Enum( "Loading", "Loaded")
コンテンツの状態に応じて内容を変更するような、ReactComponentを作ります。
const Content = props =>
match(props.content)({
Loading: _ => /*ロード中の表示内容*/,
Loaded: content => /*ロード後の表示内容*/
});
インストール
npm install sr-enum
機能
- 列挙体(タグ付きバリアント)の作成
- パターンマッチ
require / import
必要に応じて、いらないものは消して下さい。
const {Enum, match, maybe, option, result, Maybe, Option, Result} = require("sr-enum");
import {Enum, match, maybe, option, result, Maybe, Option, Result} from "sr-enum";
列挙体の作成
const 列挙体名 = new Enum( 列挙子名, 列挙子名, ...);
例
const Request = new Enum( "Get", "Post", "Delete" );
列挙子の作成
new 列挙体名.列挙子名( 任意の値 );
例
const request = new Request.get( "/api/hoge" );
パターンマッチ
単純な分岐
match(列挙子が代入された変数)({
列挙子名: 値を受け取る変数 => 処理,
列挙子名: 値を受け取る変数 => 処理,
default: デフォルト値
)};
例
match( request )({
Get: url => /*処理*/,
Post: url => /*処理*/,
default: /*その他の場合*/
});
複雑な分岐
match(列挙子が代入された変数)(
[パターン, 値を受け取る変数 => 処理],
[パターン, 値を受け取る変数 => 処理],
[match.default, デフォルト値]
);
例
match( request )(
[Request.Get(Url.Valid()), validUrl => /*処理*/],
[Request.Get(Url.Invalid()), _ => /*エラー処理*/],
[Request.post(), url => /*処理*/],
[match.default, デフォルト値]
);
if let
ライクな使用
const 変数 = パターン(列挙子が代入された変数);
if(変数 !== unMatched) {
パターンに合致したときの処理
}
例
const url = Request.Get(Url.Valid())(request);
if( url !== unMatched ) {
/*処理*/
}