Skip to content

Instantly share code, notes, and snippets.

@hanishi
Last active August 22, 2020 03:10
Show Gist options
  • Save hanishi/06f25d0b3ba32c3fccd7d891eba432e1 to your computer and use it in GitHub Desktop.
Save hanishi/06f25d0b3ba32c3fccd7d891eba432e1 to your computer and use it in GitHub Desktop.
@tailrec
private def criteria(
baseCriteria: Criteria,
criteriaList: Option[Criteria]*
): Criteria = {
criteriaList match {
case head :: tail =>
criteria(
head.fold(baseCriteria) { criteria =>
baseCriteria.copy(startDateTime =
criteria.startDateTime.orElse(baseCriteria.startDateTime)
)
},
tail: _*
)
case Nil => baseCriteria
}
}
@hanishi
Copy link
Author

hanishi commented Aug 22, 2020

case class Criteria(
    startDateTime: Option[LocalDateTime],
    endDateTime: Option[LocalDateTime]
) {
  def updateHierarchically(hierarchy: Seq[Option[Criteria]]): Criteria =
    Criteria.updateHierarchically(this, hierarchy)

  def update(criteria: Criteria): Criteria =
    this.copy(
      startDateTime = criteria.startDateTime.orElse(startDateTime),
      endDateTime = criteria.endDateTime.orElse(endDateTime)
    )
}

case object Criteria {

  @tailrec
  private def updateHierarchically(
      baseCriteria: Criteria,
      criteriaList: Seq[Option[Criteria]]
  ): Criteria = {
    criteriaList match {
      case head :: tail =>
        updateHierarchically(
          head.fold(baseCriteria) { criteria =>
            baseCriteria.update(criteria)
          },
          tail
        )
      case Nil => baseCriteria
    }
  }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment