Skip to content

Commit

Permalink
add CustomEmitterBuilder to get a sink and return an IO (#210)
Browse files Browse the repository at this point in the history
fixes #195
  • Loading branch information
cornerman authored and Luka Jacobowitz committed Jul 24, 2018
1 parent 159cce8 commit 7f367bf
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 7 deletions.
2 changes: 1 addition & 1 deletion src/main/scala/outwatch/dom/DomTypes.scala
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ import scala.scalajs.js
private[outwatch] object BuilderTypes {
type Attribute[T, _] = helpers.AttributeBuilder[T, Attr]
type Property[T, _] = helpers.PropBuilder[T]
type EventEmitter[E <: dom.Event] = SimpleEmitterBuilder[E, Emitter]
type EventEmitter[E <: dom.Event] = EmitterBuilder[E, E, Emitter]
}

private[outwatch] object CodecBuilder {
Expand Down
15 changes: 9 additions & 6 deletions src/main/scala/outwatch/dom/helpers/EmitterBuilder.scala
Original file line number Diff line number Diff line change
Expand Up @@ -28,13 +28,13 @@ trait EmitterBuilder[E, O, R] extends Any {
}

object EmitterBuilder extends EmitterOps {
def apply[E <: Event](eventType: String): SimpleEmitterBuilder[E, Emitter] =
def apply[E <: Event](eventType: String): EmitterBuilder[E, E, Emitter] =
SimpleEmitterBuilder[E, Emitter](observer => Emitter(eventType, event => observer.onNext(event.asInstanceOf[E])))
}

final case class TransformingEmitterBuilder[E, O, R] private[helpers](
transformer: Observable[E] => Observable[O],
create: Observer[E] => R
create: Sink[E] => IO[R]
) extends EmitterBuilder[E, O, R] {

def transform[T](tr: Observable[O] => Observable[T]): EmitterBuilder[E, T, R] = copy(
Expand All @@ -43,14 +43,17 @@ final case class TransformingEmitterBuilder[E, O, R] private[helpers](

def -->(sink: Sink[_ >: O]): IO[R] = {
val redirected: Sink[E] = sink.unsafeRedirect[E](transformer)
IO.pure(create(redirected.observer))
create(redirected)
}
}

final case class SimpleEmitterBuilder[E, R](create: Observer[E] => R) extends AnyVal with EmitterBuilder[E, E, R] {
final case class CustomEmitterBuilder[E, R](create: Sink[E] => IO[R]) extends AnyVal with EmitterBuilder[E, E, R] {

def transform[T](tr: Observable[E] => Observable[T]): EmitterBuilder[E, T, R] =
new TransformingEmitterBuilder[E, T, R](tr, create)

def -->(sink: Sink[_ >: E]): IO[R] = IO.pure(create(sink.observer))
}
def -->(sink: Sink[_ >: E]): IO[R] = create(sink)
}
object SimpleEmitterBuilder {
def apply[E, R](create: Observer[E] => R) = CustomEmitterBuilder[E, R](sink => IO.pure(create(sink.observer)))
}

0 comments on commit 7f367bf

Please sign in to comment.