gigobyte / purify

Functional programming library for TypeScript - https://gigobyte.github.io/purify/
ISC License
1.53k stars 59 forks source link

Can EitherAsync.chain support both Either and EitherAsync? #731

Open lightDer opened 1 month ago

lightDer commented 1 month ago

Hi! It's really a neat and lightweight libs. I wonder if EitherAsync.chain can support both Either and EitherAsync?

For example, if I want to chain getTitle, I need add async in the chain method. Or any recommendations for handling this? Thanks.

async function getPost (postId: number): Promise<Either<Error, Post>> {
  const response = await fetch(`/posts/${postId}`);
  return response
    ? Right((response.json() as unknown) as Post)
    : Left(new Error(`Problem fetching post with id: ${postId}`));
}

function getTitle (post: Post): Either<Error, string> {
  return post.title
    ? Right(post.title)
    : Left(new Error("This post should have a title"));
}

function getPostTitle (req: Request): EitherAsync<Error, string> {
  return EitherAsync.liftEither(validateRequest(req))
    .chain((request) => getPost(request.postId))
    .chain(async (post) => getTitle(post));
}