What type does byGrapheme() return?

H. S. Teoh hsteoh at quickfur.ath.cx
Fri Dec 27 19:44:59 UTC 2019

On Fri, Dec 27, 2019 at 06:26:58PM +0100, Robert M. Münch via Digitalmars-d-learn wrote:
> I love these documentation lines in the D docs:
> 	auto byGrapheme(Range)(Range range)
> How should I know what auto is? Why not write the explicit type so
> that I know what to expect? When declaring a variable as class/struct
> member I can't use auto but need the explicit type...
> I used typeof() but that doesn't help a lot:
> gText = [Grapheme(53, 0, 0, 72057594037927936, [83, ...., 1)]Result!string
> I want to iterate a string byGrapheme so that I can add, delete,
> change graphemes.

Since graphemes are variable-length in terms of code points, you can't
exactly *edit* a range of graphemes -- you can't replace a 1-codepoint
grapheme with a 6-codepoint grapheme, for example, since there's no
space in the underlying string to store that.

If you want to add/delete/change graphemes, what you *really* want is to
use an array of Graphemes:

	Grapheme[] editableGraphs;

You can then splice it, insert stuff, delete stuff, whatever.

When you're done with it, convert it back to string with something like

	string result = editableGraphs.map!(g => g[]).joiner.to!string;


The irony is that Bill Gates claims to be making a stable operating system and Linus Torvalds claims to be trying to take over the world. -- Anonymous

More information about the Digitalmars-d-learn mailing list