public static Result<IEnumerable<Token>, Error> ExplodeOptionList( Result<IEnumerable<Token>, Error> tokenizerResult, Func<string, Maybe<char>> optionSequenceWithSeparatorLookup) { var tokens = tokenizerResult.SucceededWith(); var replaces = tokens.Select((t,i) => optionSequenceWithSeparatorLookup(t.Text) .Return(sep => Tuple.Create(i + 1, sep), Tuple.Create(-1, '\0'))).SkipWhile(x => x.Item1 < 0); var exploded = tokens.Select((t, i) => replaces.FirstOrDefault(x => x.Item1 == i).ToMaybe() .Return(r => t.Text.Split(r.Item2).Select(Token.Value), Enumerable.Empty<Token>().Concat(new[]{ t }))); var flattened = exploded.SelectMany(x => x); return Result.Succeed(flattened, tokenizerResult.Messages()); }