LoginSignup
0
1

More than 3 years have passed since last update.

JSに列挙体を実装

Last updated at Posted at 2019-08-22

概要

先日自作した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 ) {
    /*処理*/
}

詳細

npm

github

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1