After using it a bit I realise that the simplest description is that it is exactly the same as the arguments in a for
loop...
(from:to:step)
Any of them are optional:
(:to:step)
(from::step)
(from:to)
Then the negative indexing just needs you to add the length of the string to the negative indices to understand it.
This works for me anyway...