Search code examples
scalabindmonadsflatmap

Scala flatMap method on Option type cannot be resolved. What is the correct way to do this?


  def jobEventToJobEventTimeLine(jobEvent: JobEvent): JobEventTimeline = {
    val OpFields(stepId, jobBaseStepId, fieldId) = extractFromOp(jobEvent.getOp)
    JobEventTimeline(
      jobEvent.getJobId,
      if (jobEvent.isSetTyp) Some(jobEvent.getTyp.toString) else None,
      if (jobEvent.isSetInPlanning) Some(jobEvent.inPlanning) else None,
      jobEvent.getPedigree.getTeamId,
      jobEvent.getPedigree.getActorId,
      if (jobEvent.getPedigree.isSetAdminActorId) Some(jobEvent.getPedigree.getAdminActorId) else None,
      jobEvent.getPedigree.getSessionId,
      if (jobEvent.getPedigree.isSetClientSessionId) Some(jobEvent.getPedigree.getClientSessionId) else None,
      jobEvent.getPedigree.getCreatedAt,
      jobEvent.getPedigree.getSeqId,
      if (jobEvent.getPedigree.isSetIsSideEffect) Some(jobEvent.getPedigree.isSideEffect) else None,
      jobEvent.getOp.getSetField.toString,
      stepId,
      jobBaseStepId,
      fieldId,
      if (jobEvent.isSetReceivedAt) Some(jobEvent.getReceivedAt) else None
    )
  }

  def ToJobEvent(binData: Array[Byte]): Option[JobEventTimeline] = FuncUtils.deserializeJobEvent(binData) flatMap Some(jobEventToJobEventTimeLine(_))

I'm trying to use flatMap as a bind operator to apply a monadic Value to a monad however my IDE is saying flatMap can't be resolved. What is the correct way to do this?


Solution

  • Some(jobEventToJobEventTimeLine(_)) means Some(x => jobEventToJobEventTimeLine(x)), not x => Some(jobEventToJobEventTimeLine(x)), so the types don't match. Write

    FuncUtils.deserializeJobEvent(binData).flatMap { x => Some(jobEventToJobEventTimeLine(x)) }
    

    explicitly.

    Also, if (jobEvent.isSetTyp) Some(jobEvent.getTyp.toString) else None can be written as Option.when(jobEvent.isSetTyp)(jobEvent.getTyp.toString).