fn inputter () -> {
  if do input > unbox > empty?
    then {
      yield! ()
      inputter ()
    }
    else receive {
      (:get, pid) -> send (pid, (:reply, unbox (input)))
      (:flush, pid) -> {
        send (pid, (:reply, unbox (input)))
        store! (input, "")
      }
      (:clear) -> store! (input, "")
    }
  
}

fn clear_input () -> store! (input, "")

fn read_input () -> {
  let reader = spawn! (inputter)
  send (reader, (:get, self ()))
  receive {
    (:reply, msg) -> msg
  }
}

fn flush_input () -> {
  let reader = spawn! (inputter)
  send (reader, (:flush, self ()))
  receive {
    (:reply, msg) -> msg
  }
}
