monet / monet.js

monet.js - Monadic types library for JavaScript
https://monet.github.io/monet.js/
MIT License
1.6k stars 114 forks source link

[request for help] - casting right type on left #251

Open stefaanMLB opened 2 years ago

stefaanMLB commented 2 years ago

I'm new to functional programming and I am probably doing this all wrong. I very much like using Either to pass errors up the call chain. In practice, I find myself using a type cast of the right side when the either is a Left very often which feels wrong. This typically happens when a function in the middel of the call chain catches a left from a function down the chain that has a different Right type than the function itself. I assume there must be a better way of doing this otherwise the cast function would probably be part of the library.

What is the better way ?

Here's an simplified example

function castRight_of_Left<RT>(either: Either<Error, unknown>) {
  return Left<Error, RT>(either.left())
}

public async getOrder(orderNumber: string): Promise<Either<Error, Order>> {
  let result = await this._orderRepo.getOrderByOrderNumber(orderNumber)             // returns Promise<Either<Error, Order | null>>
  if (result.isLeft()) return castRight_of_Left<Order_and_Sample>(result)           // Database error, pass the error up the call chain
  if (getSampleresult.right() == null) return Left(new Error(`order not found`))    // aanvraag niet gevonden
  const order = result.right()!

  // ... manipulations of the order object

  return Right(order)
}
stefaanMLB commented 2 years ago

Anyone ?