見出し画像

fp-tsライブラリを使ったEitherからTaskEitherへ持ち替えてchainで取り回すワークアラウンドの紹介~fromEitherで実現~

こんにちわ。nap5です。

fp-tsライブラリを使ったEitherからTaskEitherへ持ち替えてchainで取り回すワークアラウンドの紹介をしたいと思います。


まずはEitherアイテムを作成する関数を定義します。

import { Either, left, right } from "fp-ts/lib/Either";

const doEitherTask = (n: number): Either<CustomErrorData, UserId> => {
  if (n % 2 === 0) {
    return left(new CustomError(`Something went wrong... [${n}]`));
  }
  return right(n);
};


このEitherアイテムをTaskEitherに持ち替えたときに戻り値がTaskEitherである関数も定義します。


import { TaskEither } from "fp-ts/lib/TaskEither";
import { tryCatch } from "fp-ts/lib/TaskEither";

const doN = (n: number): TaskEither<CustomErrorData, UserId> => {
  return tryCatch(
    async () => {
      if (n % 2 === 0) {
        return Promise.reject(
          new CustomError(`Something went wrong... [${n}]`)
        );
      }
      return n * n;
    },
    (e) => e as CustomErrorData
  );
};


最後にpipeでfromEither経由でchainに取り回しておしまいです。

(async () => {
  // https://stackoverflow.com/a/66341866/15972569
  const result = await pipe(
    doEitherTask(3),
    fromEither,
    (x) => x, // for debug
    chain((x) => doN(x))
  )();
  console.log(result);
})();


デバッグ用に以下のように書くと入出力の透明度を確認できるので、ハンディです。

(x) => x


デモコードです。



簡単ですが、以上です。



この記事が気に入ったらサポートをしてみませんか?