src/main/java/com/nurkiewicz/lazyseq/LazySeq.java
public String mkString(String start, String sep, String end, boolean lazy) {
		final StringBuilder s = new StringBuilder(start);
		LazySeq<E> cur = this;
		while (!cur.isEmpty()) {
			s.append(cur.head());
			if (!lazy || cur.isTailDefined()) {
				if (!cur.tail().isEmpty()) {
					s.append(sep);
				}
				cur = cur.tail();
			} else {
				s.append(sep).append("?");
				break;
			}
		}
		return s.append(end).toString();
	}
public String mkString(String start, String sep, String end, boolean lazy) {
		final StringBuilder s = new StringBuilder(start);
		LazySeq<E> cur = this;
		while (!cur.isEmpty()) {
			s.append(cur.head());
			if (!lazy || cur.isTailDefined()) {
				if (!cur.tail().isEmpty()) {
					s.append(sep);
				}
				cur = cur.tail();
			} else {
				s.append(sep).append("?");
				break;
			}
		}
		return s.append(end).toString();
	}
Returns a string representation of this {@link LazySeq}.
The string result starts with the string <code>start</code> and ends with <code>end</code>,
whereas <code>sep</code> is as separator string between the elements of this sequence.
If <code>lazy</code> is <code>true</code> the evaluation stops at the first unspecific element.