diff --git a/src/main/scala/com/raquo/laminar/keys/EventProcessor.scala b/src/main/scala/com/raquo/laminar/keys/EventProcessor.scala index 68f782de..0218c630 100644 --- a/src/main/scala/com/raquo/laminar/keys/EventProcessor.scala +++ b/src/main/scala/com/raquo/laminar/keys/EventProcessor.scala @@ -221,7 +221,14 @@ class EventProcessor[Ev <: dom.Event, V]( * * a(onClick.preventDefault.compose(_.delay(100)) --> observer) * + * Note: can also use with more compact `apply` alias: + * + * div(onScroll(_.throttle(100)) --> observer) + * + * a(onClick.preventDefault(_.delay(100)) --> observer) + * * Note: This method is not chainable. Put all the operations you need inside the `operator` callback. + * */ def compose[Out]( operator: EventStream[V] => Observable[Out] @@ -229,6 +236,13 @@ class EventProcessor[Ev <: dom.Event, V]( new LockedEventKey(this, operator) } + /** Alias for [[compose]] */ + @inline def apply[Out]( + composer: EventStream[V] => Observable[Out] + ): LockedEventKey[Ev, V, Out] = { + compose(composer) + } + /** Similar to the Airstream `flatMap` operator. * * Use this when you want to create a new stream or signal on every event, e.g.: diff --git a/src/test/scala/com/raquo/laminar/SyntaxSpec.scala b/src/test/scala/com/raquo/laminar/SyntaxSpec.scala index 151b8d06..5ef36093 100644 --- a/src/test/scala/com/raquo/laminar/SyntaxSpec.scala +++ b/src/test/scala/com/raquo/laminar/SyntaxSpec.scala @@ -609,4 +609,14 @@ class SyntaxSpec extends UnitSpec { assert(intVar.now() == 15) } + it("compose syntax") { + val eventObs = Observer.empty[dom.Event] + div( + onClick.compose(_.delay(100)) --> eventObs, + onClick(_.delay(100)) --> eventObs, + // + onClick.preventDefault.compose(_.delay(100)) --> eventObs, + onClick.preventDefault(_.delay(100)) --> eventObs, + ) + } }