/// <inheritdoc />
 public void WriteXml(XmlWriter writer)
 {
     writer.WriteAttributeString(nameof(LineBreaks), LineBreaks.ToString());
     writer.WriteAttributeString(nameof(LineBreakTrimDirection), LineBreakTrimDirection.ToString());
 }
        /// <inheritdoc />
        public string Apply(string value)
        {
            var breaksFound = 0;

            if (LineBreaks == 0 && LineBreakTrimDirection.HasFlagFast(LineBreakTrimDirection.Begin))
            {
                for (int i = 0; i < value.Length; i++)
                {
                    var c = value[i];
                    if (c == '\t')
                    {
                        continue;
                    }
                    if (c == ' ')
                    {
                        continue;
                    }
                    if (c == '\r' || c == '\n')
                    {
                        c = value[i + 1];
                        if (c == '\r' || c == '\n')
                        {
                            i++;
                        }
                        return(value.Substring(i + 1));
                    }
                    return(value.Substring(i));
                }

                return(value);
            }
            if (LineBreaks == 0 && LineBreakTrimDirection.HasFlagFast(LineBreakTrimDirection.End))
            {
                for (int i = value.Length - 1; i > 0; i--)
                {
                    var c = value[i];
                    if (c == '\t')
                    {
                        continue;
                    }
                    if (c == ' ')
                    {
                        continue;
                    }
                    if (c == '\r' || c == '\n')
                    {
                        c = value[i - 1];
                        i--;
                        if (c == '\r' || c == '\n')
                        {
                            i--;
                        }
                    }
                    return(value.Substring(0, i + 1));
                }
                return(value);
            }
            if (LineBreaks == -1 && LineBreakTrimDirection.HasFlagFast(LineBreakTrimDirection.Begin))
            {
                return(value.TrimStart(Tokenizer.GetWhitespaceDelimiters()));
            }
            if (LineBreaks == -1 && LineBreakTrimDirection.HasFlagFast(LineBreakTrimDirection.End))
            {
                return(value.TrimEnd(Tokenizer.GetWhitespaceDelimiters()));
            }
            for (int i = 0; i < value.Length; i++)
            {
                var c = value[i];
                if (Tokenizer.IsWhiteSpaceDelimiter(c))
                {
                    if (LineBreaks == ++breaksFound)
                    {
                        if (value.Length + 1 >= i)
                        {
                            return(value.Substring(i + 1));
                        }

                        return(string.Empty);
                    }
                }
                else
                {
                    return(value.Substring(i));
                }
            }
            return(string.Empty);
        }
 /// <summary>
 ///
 /// </summary>
 /// <param name="value"></param>
 /// <param name="flag"></param>
 /// <returns></returns>
 public static bool HasFlagFast(this LineBreakTrimDirection value, LineBreakTrimDirection flag)
 {
     return((value & flag) != 0);
 }