internal static NfaEdge Create(char min, char max) { int int_min = (int)min; int int_max = (int)max; int n = -1; int x = -1; for (int i = 0; i < codePointRanges.Length; ++i) { if (codePointRanges[i].Item1 <= int_min && int_min <= codePointRanges[i].Item2) { n = i; } if (codePointRanges[i].Item1 <= int_max && int_max <= codePointRanges[i].Item2) { x = i; } } var ranges = new List <Tuple <int, int> >(); // from biggest to smallest -- it creates fibers from longest to shortest // important to create multi-edge with merged tails for (int i = x; i >= n; --i) { Tuple <int, int> tuple = codePointRanges[i]; if (i == n) { tuple = Tuple.Create(int_min, tuple.Item2); } if (i == x) { tuple = Tuple.Create(tuple.Item1, int_max); } ranges.Add(tuple); } return(new NfaEdge(ranges.Select(it => Fiber.CreateChain(it)))); }