Blocks

Yield Patterns

Imported from the upstream Vibescript examples at blocks/yield_patterns.vibe and runnable in the browser today.

Reference View source
Source blocks/yield_patterns.vibe
# vibe: 0.2

def times(n)
  i = 0
  while i < n
    yield(i)
    i = i + 1
  end
end

def with_retry(max_attempts, delay_seconds)
  attempt = 0
  while attempt < max_attempts
    result = yield(attempt)
    if result
      return result
    end
    attempt = attempt + 1
  end
  nil
end

def benchmark
  start = Time.now
  result = yield
  elapsed = Time.now - start
  { result: result, elapsed: elapsed }
end

def tap(value)
  yield(value)
  value
end

def transform_keys(hash)
  result = {}
  hash.keys.each do |key|
    new_key = yield(key)
    result[new_key] = hash[key]
  end
  result
end

def run
  collected = []
  times(5) do |i|
    collected = collected + [i]
  end

  tapped = tap(42) do |v|
    v * 2
  end

  keys = transform_keys({ name: "Alice", age: 30 }) do |k|
    k
  end

  {
    times: collected,
    tap: tapped,
    transform_keys: keys
  }
end
Output
Press run to execute run from this example.
upstream blocks browser-runner