code: private CharSequence iterableContext(final Iterable<Object> context, final Options options)
        throws IOException {
      StringBuilder buffer = new StringBuilder();
      if (options.isFalsy(context)) {
        buffer.append(options.inverse());
      } else {
        Iterator<Object> iterator = context.iterator();
        int index = -1;
        Context parent = options.context;
        while (iterator.hasNext()) {
          index += 1;
          Object element = iterator.next();
          boolean first = index == 0;
          boolean even = index % 2 == 0;
          boolean last = !iterator.hasNext();
          Context current = Context.newBuilder(parent, element)
              .combine("@index", index)
              .combine("@first", first ? "first" : "")
              .combine("@last", last ? "last" : "")
              .combine("@odd", even ? "" : "odd")
              .combine("@even", even ? "even" : "")
              .build();
          buffer.append(options.fn(current));
          current.destroy();
        }
      }
      return buffer.toString();
    }
docs: Iterate over an iterable object.
  
  @param context The context object.
  @param options The helper options.
  @return The string output.
  @throws IOException If something goes wrong.