All Downloads are FREE. Search and download functionalities are using the official Maven repository.

japgolly.scalajs.react.callback.RateLimit.scala Maven / Gradle / Ivy

There is a newer version: 3.0.0-beta12
Show newest version
package japgolly.scalajs.react.callback

import scala.scalajs.js

object RateLimit {

  type Clock = () => Long

  val realClock: Clock =
    () => System.currentTimeMillis()

  def fn[A, B](run: A => B, maxPerWindow: Int, windowMs: Long, clock: Clock = realClock): A => Option[B] = {
    val windowRuns = new js.Array[Long]

    a => {
      val now         = clock()
      val windowStart = now - windowMs

      // prune current window
      while (windowRuns.nonEmpty && windowRuns(0) < windowStart)
        windowRuns.shift()

      if (windowRuns.length >= maxPerWindow)
        None
      else {
        windowRuns.push(now)
        Some(run(a))
      }
    }
  }

  def fn0[A](run: () => A, maxPerWindow: Int, windowMs: Long, clock: Clock = realClock): () => Option[A] = {
    val f = fn[Unit, A](
      run          = _ => run(),
      windowMs     = windowMs,
      maxPerWindow = maxPerWindow,
      clock        = clock,
    )
    () => f(())
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy