local function prequire(name) local success, result = pcall(require, name); return success and result end
local bench = script and require(script.Parent.bench_support) or prequire("bench_support") or require("../bench_support")

function test()

  -- $Id: methcall.lua,v 1.2 2004-06-12 16:19:43 bfulgham Exp $
  -- http://shootout.alioth.debian.org
  -- contributed by Roberto Ierusalimschy

  --------------------------------------------------------------
  -- Toggle class
  --------------------------------------------------------------

  Toggle = {}

  function Toggle:value ()
    return self.state
  end

  function Toggle:activate ()
    self.state = not self.state
    return self
  end

  function Toggle:new (start_state)
    local o = {state = start_state}
    self.__index =self
    setmetatable(o, self)
    return o
  end


  --------------------------------------------------------------
  -- NthToggle class
  --------------------------------------------------------------

  NthToggle = Toggle:new()

  function NthToggle:activate ()
    self.counter = self.counter + 1
    if self.counter >= self.count_max then
      Toggle.activate(self)
      self.counter = 0
    end
    return self
  end

  function NthToggle:new (start_state, max_counter)
    local o = Toggle.new(self, start_state)
    o.count_max = max_counter
    o.counter = 0
    return o
  end


  -----------------------------------------------------------
  -- main
  -----------------------------------------------------------

  function main ()
    local start = os.clock()
    local N = 30000

    local val = 1
    local toggle = Toggle:new(val)
    for i=1,N do
      val = toggle:activate():value()
      val = toggle:activate():value()
      val = toggle:activate():value()
      val = toggle:activate():value()
      val = toggle:activate():value()
      val = toggle:activate():value()
      val = toggle:activate():value()
      val = toggle:activate():value()
      val = toggle:activate():value()
      val = toggle:activate():value()
    end
    print(val and "true" or "false")

    val = 1
    local ntoggle = NthToggle:new(val, 3)
    for i=1,N do
      val = ntoggle:activate():value()
      val = ntoggle:activate():value()
      val = ntoggle:activate():value()
      val = ntoggle:activate():value()
      val = ntoggle:activate():value()
      val = ntoggle:activate():value()
      val = ntoggle:activate():value()
      val = ntoggle:activate():value()
      val = ntoggle:activate():value()
      val = ntoggle:activate():value()
    end
    print(val and "true" or "false")
    return os.clock() - start
  end

  return main()
end

bench.runCode(test, "MethodCalls")