blob: e558462b79a434d9618a74ca4b5ba03bec2a1a6d [file] [log] [blame]
using System.Linq;
using OfficeOpenXml.FormulaParsing.Exceptions;
using OfficeOpenXml.FormulaParsing.Utilities;
namespace OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup;
public class ArrayLookupNavigator : LookupNavigator {
private readonly FunctionArgument[] _arrayData;
private int _index;
private object _currentValue;
public ArrayLookupNavigator(
LookupDirection direction,
LookupArguments arguments,
ParsingContext parsingContext)
: base(direction, arguments, parsingContext) {
Require.That(arguments).Named("arguments").IsNotNull();
Require.That(arguments.DataArray).Named("arguments.DataArray").IsNotNull();
_arrayData = arguments.DataArray.ToArray();
Initialize();
}
private void Initialize() {
if (Arguments.LookupIndex >= _arrayData.Length) {
throw new ExcelErrorValueException(eErrorType.Ref);
}
SetCurrentValue();
}
public override int Index => _index;
private void SetCurrentValue() {
_currentValue = _arrayData[_index];
}
private bool HasNext() {
if (Direction == LookupDirection.Vertical) {
return _index < (_arrayData.Length - 1);
}
return false;
}
public override bool MoveNext() {
if (!HasNext()) {
return false;
}
if (Direction == LookupDirection.Vertical) {
_index++;
}
SetCurrentValue();
return true;
}
public override object CurrentValue => _arrayData[_index].Value;
public override object GetLookupValue() {
return _arrayData[_index].Value;
}
}