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

simpleivr.DefaultSayer.scala Maven / Gradle / Ivy

package simpleivr

import cats.effect.IO

import scala.concurrent.duration.DurationInt


class DefaultSayer(interp: IvrCommand.Interpreter[IO], interruptDtmfs: Set[DTMF])
  extends Sayable.Folder[IO[Option[DTMF]]] {

  private def curTime = IO(System.currentTimeMillis())

  override def pause(ms: Int): IO[Option[DTMF]] =
    if (ms <= 0)
      IO.pure(None)
    else if (interruptDtmfs.isEmpty)
      IO.sleep(ms.millis).as(None)
    else
      for {
        startTime <- curTime
        digit <- interp.waitForDigit(ms)
        res <-
          if (digit.exists(interruptDtmfs))
            IO.pure(digit)
          else
            curTime.map(_ - startTime).flatMap(elapsed => pause(ms - elapsed.toInt))
      } yield res

  override def play(path: AudioPath) = interp.streamFile(path.pathAndName, interruptDtmfs)

  override def speak(spk: Speaks#Speak) = {
    println("Speaking: " + spk.msg)
    spk.backend.speakPath(spk)
      .flatMap(play)
  }

  override def group(sayable: Sayable) = apply(sayable)

  override def many(sayables: List[Sayable]): IO[Option[DTMF]] =
    sayables match {
      case Nil         => IO.pure(None)
      case msg :: msgs =>
        apply(msg)
          .flatMap {
            case Some(c) => IO.pure(Some(c))
            case None    => many(msgs)
          }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy