packages feed

zeolite-lang-0.22.0.0: example/random/random-demo.0rx

concrete RandomDemo {
  @type run () -> ()
}

define RandomDemo {
  run () {
    Float timeLimit <- 0.0
    Float startTime <- Realtime.monoSeconds()
    if (Argv.global().size() > 1) {
      timeLimit <- ParseChars.float(Argv.global().readAt(1)).getValue()
    }

    // Rough distribution of letter frequencies in the English language.
    // Taken from https://en.wikipedia.org/wiki/Letter_frequency.
    // NOTE: The overall scale here doesn't matter; it just matters what the
    // relative weights are. CategoricalTree only supports positive Int weights.
    CategoricalTree<Char> weights <- CategoricalTree<Char>.new()
        .setWeight('a',8167)
        .setWeight('b',1492)
        .setWeight('c',2782)
        .setWeight('d',4253)
        .setWeight('e',12702)
        .setWeight('f',2228)
        .setWeight('g',2015)
        .setWeight('h',6094)
        .setWeight('i',6966)
        .setWeight('j',153)
        .setWeight('k',772)
        .setWeight('l',4025)
        .setWeight('m',2406)
        .setWeight('n',6749)
        .setWeight('o',7507)
        .setWeight('p',1929)
        .setWeight('q',95)
        .setWeight('r',5987)
        .setWeight('s',6327)
        .setWeight('t',9056)
        .setWeight('u',2758)
        .setWeight('v',978)
        .setWeight('w',2361)
        .setWeight('x',150)
        .setWeight('y',1974)
        .setWeight('z',74)

    Generator<Char>  letter <- weights `RandomCategorical:sampleWith` RandomUniform.probability()
    Generator<Float> length <- RandomGaussian.new(5.0,3.0)
    Generator<Float> timing <- RandomExponential.new(4.0)

    while (timeLimit <= 0.0 || Realtime.monoSeconds() < startTime+timeLimit) {
      // Generate a word with a random length.
      Int wordLength <- length.generate().asInt()
      if (wordLength < 1) {
        continue
      }
      CharBuffer buffer <- CharBuffer.new(wordLength)

      // Populate the letters using their relative frequencies.
      traverse (Counter.zeroIndexed(buffer.size()) -> Int pos) {
        \ buffer.writeAt(pos,letter.generate())
      }

      // Print the word.
      \ BasicOutput.stdout()
          .write(String.fromCharBuffer(buffer))
          .write("\n")
          .flush()

      // Wait a random amount of time.
      \ Realtime.sleepSeconds(timing.generate())
    }
  }
}