text: """
  Bank renege example
  
  Covers:
  - Resources: Resource
  - Condition events
  
  Scenario:
  This example models a bank counter and customers arriving at random times.
  Each customer has a certain patience. She waits to get to the counter until
  she’s at the end of her tether. If she gets to the counter, she uses it for
  a while before releasing it.
  New customers are created by the source process every few time steps.
  """
  import random
  import simpy
  
  RANDOM_SEED = 42
  NEW_CUSTOMERS = 4  # Total number of customers
  INTERVAL_CUSTOMERS = 10.0  # Generate new customers roughly every x seconds
  MIN_PATIENCE = 1  # Min. customer patience
  MAX_PATIENCE = 3  # Max. customer patience
  
  
  def source(env, number, interval, counter):
      """Source generates customers randomly"""
      for i in range(number):
          c = customer(env, 'Customer%02d' % i, counter, time_in_bank=12.0)
          env.process(c)
          t = random.expovariate(1.0 / interval)
          print(f't : {t}')
          yield env.timeout(t)
  
  
  def customer(env, name, counter, time_in_bank):
      """Customer arrives, is served and leaves."""
      arrive = env.now
      print('%7.4f %s: Here I am' % (arrive, name))
  
      with counter.request() as req:
          patience = random.uniform(MIN_PATIENCE, MAX_PATIENCE)
          # Wait for the counter or abort at the end of our tether
          results = yield req | env.timeout(patience)
  
          wait = env.now - arrive
  
          if req in results:
              # We got to the counter
              print('%7.4f %s: Waited %6.3f' % (env.now, name, wait))
  
              tib = random.expovariate(1.0 / time_in_bank)
              yield env.timeout(tib)
              print('%7.4f %s: Finished' % (env.now, name))
  
          else:
              # We reneged
              print('%7.4f %s: RENEGED after %6.3f' % (env.now, name, wait))
  
  
  # Setup and start the simulation
  print('Bank renege')
  random.seed(RANDOM_SEED)
  env = simpy.Environment()
  
  # Start processes and run
  counter = simpy.Resource(env, capacity=1)
  env.process(source(env, NEW_CUSTOMERS, INTERVAL_CUSTOMERS, counter))
  env.run()
  