public override EvaluationResult evaluate <T1>(IEnumerable <T1> iterable, CalculationFunctions functions, string firstToken, IList <string> remainingTokens)
        {
            string token = firstToken.ToLower(Locale.ENGLISH);
            int?   index = Ints.tryParse(token);

            if (index != null)
            {
                try
                {
                    return(EvaluationResult.success(Iterables.get(iterable, index), remainingTokens));
                }
                catch (System.IndexOutOfRangeException)
                {
                    return(invalidTokenFailure(iterable, token));
                }
            }
            ISet <string> tokens = this.tokens(iterable);

            foreach (object item in iterable)
            {
                if (!fieldValues(item).Contains(token))
                {
                    continue;
                }
                if (!tokens.Contains(token))
                {
                    return(ambiguousTokenFailure(iterable, token));
                }
                return(EvaluationResult.success(item, remainingTokens));
            }
            return(invalidTokenFailure(iterable, token));
        }
        // parse inflation lag with convention defaults
        private static Period parseInflationLag(Optional <string> strOpt, Currency currency)
        {
            if (!strOpt.Present)
            {
                if (Currency.GBP.Equals(currency))
                {
                    return(Period.ofMonths(2));
                }
                return(Period.ofMonths(3));
            }
            string str    = strOpt.get();
            int?   months = Ints.tryParse(str);

            if (months != null)
            {
                return(Period.ofMonths(months));
            }
            return(Tenor.parse(str).Period);
        }