export expand string {
	public const in(c as char) as bool
		=> indexOf(c) >= 0;
	
	public const indexOf(c as char) as int {
		for i in 0 .. length {
			if this[i] == c
				return i;
		}
		
		return -1;
	}
	
	public const indexOf(c as char, from as int) as int {
		for i in from .. length {
			if this[i] == c
				return i;
		}
		
		return -1;
	}
	
	public const lastIndexOf(c as char) as int {
		var i = length;
		while i > 0 {
			i--;
			if this[i] == c
				return i;
		}
		
		return -1;
	}
	
	public const lastIndexOf(c as char, until as int) as int {
		var i = until;
		while i > 0 {
			i--;
			if this[i] == c
				return i;
		}
		
		return -1;
	}
	
	public const split(delimiter as char) as string[] {
		val result = new List<string>();
		var start = 0;
		for i in 0 .. this.length {
			if this[i] == delimiter {
				result.add(this[start .. i]);
				start = i + 1;
			}
		}
		result.add(this[start .. $]);
		return result as string[];
	}
	
	public const trim() as string {
		var from = 0;
		while from < this.length && this[from] in [' ', '\t', '\r', '\n']
			from++;
		var to = this.length;
		while to > 0 && this[to - 1] in [' ', '\t', '\r', '\n']
			to--;
		
		return to < from ? "" : this[from .. to];
	}
	
	public const lpad(length as int, c as char) as string
		=> this.length >= length ? this : c.times(length - this.length) + this;
	
	public const rpad(length as int, c as char) as string
		=> this.length >= length ? this : this + c.times(length - this.length);
}