"Wait time (minutes): ".print
time := ().read_line.trim.parse_float.try((
  () -> {
    "Not a number!".eprintln
    1.panic
  }
  f -> f
))

("Waiting for ", time, " minutes...").concat.eprintln

secs := time.product(60)

secs.sleep

"Will pause in 10 minutes or once the current song finishes playing.".eprintln

last_song := ().queue_get_current_song.try((
  () -> {
    ().pause
    0.panic
  }
  song -> song
))

// after 10 mins, give up
break := false
{() -> { 600.sleep, &break = true }}.thread

waiting_chars := ("|", "/", "-", "\\")
waiting_index := 0

// wait for song change or for 10 minutes to have elapsed
().loop(() -> {
  if break (()) else {
    song := ().queue_get_current_song
    song.try((
      // no song playing, so exit
      () -> (())
      // a song is playing. check if it has changed
      song -> if song.eq(last_song) {
        // show a spinner
        waiting_chars.get(waiting_index).try((
          () -> ()
          (c) -> ("\r", c).concat.eprint
        ))
        &waiting_index = waiting_index.sum(1)
        if waiting_index.gtoe(waiting_chars.len) {
          &waiting_index = 0
        }
        // wait a second before checking again
        1.sleep
      } else {
        (())
      }
    ))
  }
})

"\rPausing".eprintln
().pause
"Sleep Timer!".send_server_notification
