Remove the need to wrap every model in ZIO

This commit is contained in:
Paul-Henri Froidmont 2025-11-07 01:34:59 +01:00
parent 1da129f855
commit c19086ef32
Signed by: phfroidmont
GPG key ID: BE948AFD7E7873BE
6 changed files with 24 additions and 30 deletions

View file

@ -6,20 +6,19 @@ import zio.stream.ZStream
class CounterLiveView() extends LiveView[Msg, Model]:
def init = ZIO.succeed(
def init =
Model(
isVisible = true,
counter = 0
)
)
def update(model: Model) =
case Msg.ToggleCounter =>
ZIO.succeed(model.focus(_.isVisible).modify(!_))
model.focus(_.isVisible).modify(!_)
case Msg.IncCounter =>
ZIO.succeed(model.focus(_.counter).modify(_ + 1))
model.focus(_.counter).modify(_ + 1)
case Msg.DecCounter =>
ZIO.succeed(model.focus(_.counter).modify(_ - 1))
model.focus(_.counter).modify(_ - 1)
def view(model: Dyn[Model]) =
div(

View file

@ -9,9 +9,9 @@ class HomeLiveView() extends LiveView[String, Unit]:
"/todo" -> "Todo"
)
def init = ZIO.succeed(())
def init = ()
def update(model: Unit) = _ => ZIO.succeed(model)
def update(model: Unit) = _ => model
def view(model: Dyn[Unit]) =
ul(

View file

@ -6,7 +6,7 @@ import zio.stream.ZStream
class ListLiveView(someParam: String) extends LiveView[Msg, Model]:
def init = ZIO.succeed(
def init =
Model(
elems = List(
NestedModel("a", 10),
@ -14,11 +14,10 @@ class ListLiveView(someParam: String) extends LiveView[Msg, Model]:
NestedModel("c", 20)
)
)
)
def update(model: Model) =
case Msg.IncAge(value) =>
ZIO.succeed(model.focus(_.elems.index(2).age).modify(_ + value))
model.focus(_.elems.index(2).age).modify(_ + value)
def view(model: Dyn[Model]) =
div(

View file

@ -6,30 +6,24 @@ import zio.stream.ZStream
class TodoLiveView() extends LiveView[Msg, Model]:
def init = ZIO.succeed(Model(List(Todo(99, "some task"))))
def init = Model(List(Todo(99, "Buy eggs")))
def update(model: Model) =
case Msg.Add(text) =>
val nextId = model.todos.maxByOption(_.id).map(_.id).getOrElse(1) + 1
ZIO.succeed(
model
.focus(_.todos)
.modify(_.appended(Todo(nextId, text)))
)
model
.focus(_.todos)
.modify(_.appended(Todo(nextId, text)))
case Msg.Remove(id) =>
ZIO.succeed(
model
.focus(_.todos)
.modify(_.filterNot(_.id == id))
)
model
.focus(_.todos)
.modify(_.filterNot(_.id == id))
case Msg.ToggleCompletion(id) =>
ZIO.succeed(
model
.focus(_.todos)
.modify(
_.map(todo => if todo.id == id then todo.copy(completed = todo.completed) else todo)
)
)
model
.focus(_.todos)
.modify(
_.map(todo => if todo.id == id then todo.copy(completed = todo.completed) else todo)
)
def view(model: Dyn[Model]) =
div(