
contract MapUpdater =
  function update_map : (int, string, map(int, string)) => map(int, string)

contract Benchmark =

  record state = { updater : MapUpdater,
                   map     : map(int, string) }

  function init(u, m) = { updater = u, map = m }

  function set_updater(u) = put(state{ updater = u })

  function update_map(k : int, v : string, m) = m{ [k] = v }

  function update(a : int, b : int, v : string) =
    if (a > b) ()
    else
      put(state{ map[a] = v })
      update(a + 1, b, v)

  function get(k) = state.map[k]
  function noop() = ()

  function benchmark(k, v) =
    let m = state.updater.update_map(k, v, state.map)
    put(state{ map = m })
    m

