A tentative to reproduce some JS async/await code in Scala
// reference: https://hackernoon.com/an-ode-to-async-await-7da2dd3c2056
val servers = List("http://www.sevengramscaffe.com", "http://www.hernanparra.co", "http://www.theimeandyou.com", "http://www.luchoycarmelo.com")
Await.result(async {
val result = await { pingServers(servers) }
result.foreach { case (url, count) => println(s"$url failed $count time(s)") }
}, 1 minute)
def pingServers(servers: List[String]) = Future.sequence(servers.map(pingOneServer)).map(_.filter(_._2 > 0).toMap)
def pingOneServer(url: String) = Future { (url, pingAttempts(url, 3)) }
def pingAttempts(url: String, n: Int) = (1 to n).fold(0) { (acc, _) => acc + Await.result(pingAndWait(url), 1 minute).map(_ => 0 /*success*/).getOrElse(1 /*fail*/) }
def pingAndWait(url: String) = async { val p = await { fetch(url) }; await { delay(500) }; p }
def fetch(url: String) = async { Try { scala.io.Source.fromURL(url).nonEmpty } }
def delay(n: Long) = async { Thread.sleep(n) }