internal static IList <AbstractSkriptPatternElement> Flatten(AbstractSkriptPatternElement element)
 {
     return(element switch
     {
         SkriptPattern skriptPattern => skriptPattern.Children.SelectMany(Flatten).ToList(),
         _ => new List <AbstractSkriptPatternElement> {
             element
         }
     });
        protected bool TryToNarrowContext(ref ParseContext ctx, out ParseResult result)
        {
            result = null;
            List <AbstractSkriptPatternElement> parentElements;
            AbstractSkriptPatternElement        parent = this;
            {
                while (parent?.Parent != null)
                {
                    parent = parent.Parent;
                }


                parentElements = PatternHelper.Flatten(parent).ToList();
            }

            var indexOfThis = ElementIndex;

            if (indexOfThis == -1)
            {
                return(true);
            }

            var fromIndex = indexOfThis + 1;

            if (fromIndex > parentElements.Count)
            {
                return(true);
            }

            var possibleInputs =
                PatternHelper.GetPossibleInputs(parentElements.SubList(fromIndex, parentElements.Count));

            if (possibleInputs == null)
            {
                return(true);
            }
            var anyMatch = false;

            foreach (var element in possibleInputs)
            {
                switch (element)
                {
                case LiteralPatternElement literal:
                    var index = ctx.Text.SafeSubstring(ctx.CurrentPosition)
                                .IndexOf(literal.Value, StringComparison.InvariantCultureIgnoreCase);

                    if (index > -1)
                    {
                        var clone = ctx;
                        clone.MaxLengthOverride = ctx.CurrentPosition + index;
                        ctx      = clone;
                        anyMatch = true;
                    }

                    break;
                }
            }

            //TODO: Return true if anyMatch is true
            return(true);
        }