Consider the following partial lens for finding values in a list by index (note that this is just a pedagogical example, as it monocle.std.list.listIndexprovides this functionality from a shelf):
import monocle.Optional
def listIndexOptional[A](i: Int): Optional[List[A], A] =
Optional[List[A], A](_.lift(i))(a => l =>
if (l.isDefinedAt(i)) l.updated(i, a) else l
)
Optional, :
val thirdString = listIndexOptional[String](2)
:
scala> thirdString.set("0")(List("a", "b", "c"))
res4: List[String] = List(a, b, 0)
scala> thirdString.set("0")(List("a", "b"))
res5: List[String] = List(a, b)
, , . , , setOption:
scala> thirdString.setOption("0")(List("a", "b", "c"))
res6: Option[List[String]] = Some(List(a, b, 0))
scala> thirdString.setOption("0")(List("a", "b"))
res7: Option[List[String]] = None
, Optional.apply A => S => S, , , , getOption setOption , .
, Optional A => S => Option[S], getOrElse(s) .