broke out implementation of string-range so I can have it constructed from a string