The many functions in Base and elsewhere with a signature like
foo(v::Vector, from::Int, to::Int)
orbar(s::String, start::Int, end::Int
. Please use a view instead. It's a cleaner API. It's easier to understand how to use it. It's usually faster. There is no need to handle the edge cases e.g. where start < end. If your implementation of substring / subarray is too slow to replace signatures like this, your implementation is bad and you need a new one.
Nice gripe/point by Jakob Nissen in the Julia Slack about targeting the right kinds of objects (not just their inputs) with your function signatures.