Skip to content

Instantly share code, notes, and snippets.

@busti
Created September 16, 2018 00:54
Show Gist options
  • Save busti/a8e257c23243f3e1fe709d25214b0700 to your computer and use it in GitHub Desktop.
Save busti/a8e257c23243f3e1fe709d25214b0700 to your computer and use it in GitHub Desktop.
class Test {
case class Item(
name: String
)
case class Model(
items: Vector[Item],
selected: Item
)
def initial = {
val fst = Item("a")
Model(
Vector(fst, Item("b"), Item("c")),
fst
)
}
sealed trait Event
case object Noop extends Event
case class Select(item: Item) extends Event
def render(out: Handler[Event], in: Observable[Model]) = {
div(
in.map(state => state.items.map( item =>
div(click(Select(item)) --> out, (
if (state.selected == item)
Some(cls := "active")
else
None
): Option[VDomModifier])(
item.name
)
))
)
}
def handle: (Model, Event) => Model = {
case (s, Select(item)) => s.copy(selected = item)
case (s, Noop) => s
}
def view: VNode = for {
handler <- Handler.create[Event]
node <- render(handler, handler.startWith(Seq(Noop)).scan(initial)(handle))
} yield node
}
OutWatch.renderInto("#test", main()).unsafeRunSync()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment