public static CLBinaryOperator LoadBinaryTimes(int priority = TimesPriority, bool valOnLeft = true, bool valOnRight = true) { BinaryTimes = CLOperators.BinaryOperators.GetOrNull("*") ?? new CLBinaryOperator("*", priority, valOnLeft, valOnRight); BinaryTimes.AddFunction(tNum, tNum, BinTimesNumbers); BinaryTimes.AddFunction(tNum, tLst, (left, right, vars, context) => BinTimesList(right, left, vars, context)); BinaryTimes.AddFunction(tNum, tStr, (left, right, vars, context) => BinTimesString(right, left, vars, context)); BinaryTimes.AddFunction(tLst, tLst, (left, right, vars, context) => BinTimesList(left, ListToNum(right), vars, context)); BinaryTimes.AddFunction(tLst, tNum, BinTimesList); BinaryTimes.AddFunction(tStr, tNum, BinTimesString); return(BinaryTimes); }
// Multiplies a list by a number. public static CalcValue BinTimesList(CalcObject left, CalcObject right, CLLocalStore vars, CLContextProvider context) { CalcList lstLeft = left as CalcList; CalcNumber numRight = right as CalcNumber; // If it has a string, we'll just repeat the list multiple times. if (lstLeft.HasString()) { int count = (int)numRight; if (count < 0) { throw new CLException("Lists cannot be repeated negative times."); } CalcValue[] lstRet = new CalcValue[lstLeft.Count * count]; for (int i = 0; i < count; i++) { for (int j = 0; j < lstLeft.Count; j++) { lstRet[i * lstLeft.Count + j] = lstLeft[j]; } } return(new CalcList(lstRet)); } else { // Otherwise we'll multiply everything by the number. CalcValue[] lstRet = new CalcValue[lstLeft.Count]; for (int i = 0; i < lstRet.Length; i++) { lstRet[i] = BinaryTimes.Run(lstLeft[i], numRight, vars, context); } return(new CalcList(lstRet)); } }