import cats.effect.concurrent.Deferred import cats.effect.implicits._ import cats.effect.{ConcurrentEffect, IO} import cats.implicits._ import org.scalajs.dom.html.Image import org.scalajs.dom.{document, Event} def loadImage[F[_]](url: String)(implicit F: ConcurrentEffect[F]): F[Boolean] = for { promise <- Deferred[F, Boolean] image <- F.delay(document.createElement("img").asInstanceOf[Image]) register = { (event: String, result: Boolean) => val listener = (_: Event) => promise.complete(result).runAsync(_ => IO.unit).unsafeRunSync() F.delay(image.addEventListener(event, listener)) } _ <- register("load", true) _ <- register("error", false) _ <- F.delay(image.src = url) result <- promise.get } yield result