Не знаю, упрощаете ли вы реальный код, но E.Either<true, false>
изоморфно c до boolean
, поэтому давайте придерживаться более простой вещи.
declare const isAuth: () => TE.TaskEither<Error, boolean>;
declare const getProfile: () => TE.TaskEither<Error, Profile>;
Затем вы добавляете ветвь условия на основе от того, является ли он аутентифицированным или нет и переносит результат getProfile:
pipe(
isAuth(),
TE.chain(authed => authed
? pipe(getProfile(), TE.map(E.right)) // wrap the returned value of `getProfile` in `Either` inside the `TaskEither`
: TE.right(E.left(false))
)
)
Это выражение имеет тип TaskEither<Error, Either<false, Profile>>
. Вероятно, вам нужно добавить некоторые аннотации типов для проверки типов, я сам не запускал код.
РЕДАКТИРОВАТЬ:
Возможно, вам нужно извлечь лямбда как именованная функция, чтобы получить правильные наборы, что-то вроде этого:
const tryGetProfile: (authed: boolean) => TE.TaskEither<Error, E.Either<false, Profile>> = authed
? pipe(getProfile(), TE.map(E.right))
: TE.right(E.left(false));
const result: TE.TaskEither<Error, E.Either<false, Profile>> = pipe(
isAuth(),
TE.chain(tryGetProfile)
);