//[DebuggerHidden] object Const(object arg) { IList arrA = arg as IList; if (arrA == null || acceptVector) { return(func(arg)); } try { int n = arrA.Count; ArrayList result; if (resultCanBeLazy) { result = new ListOfVals(n); } else { result = new ListOfConst(n); } object[] prev = null; for (int i = 0; i < n; i++) { var r = func(arrA[i]); if (r is IEnumerable <object[]> multiRes) { throw new NotImplementedException(); } else { if (r is object[] curr) { if (prev != null && Cmp.CompareTimed(prev, curr) == 0) { continue; } prev = curr; } result.Add(r); } } return(result); } catch (Exception ex) { return(ex.Wrap()); }// new Exception(string.Format("unaryOp: " + ex.Message)); } }
public static object binaryOpConst(Fxy op, object constA, object constB, bool resultCanBeLazy) { IList arrA = constA as IList; IList arrB = constB as IList; if (arrA == null && arrB == null) { return(op(constA, constB)); } try { ArrayList result; if (arrA == null) // || arrA.Count == 1) { object a = constA; // arrA == null ? argA : arrA[0]; if (resultCanBeLazy) { result = new ListOfVals(arrB.Count); } else { result = new ListOfConst(arrB.Count); } for (int i = 0; i < arrB.Count; i++) { result.Add(op(a, arrB[i])); } } else if (arrB == null) // || arrB.Count == 1) { object b = constB; // arrB == null ? argB : arrB[0]; if (resultCanBeLazy) { result = new ListOfVals(arrA.Count); } else { result = new ListOfConst(arrA.Count); } for (int i = 0; i < arrA.Count; i++) { result.Add(op(arrA[i], b)); } } else if (arrA.Count == arrB.Count) { int n = arrA.Count; if (resultCanBeLazy) { result = new ListOfVals(n); } else { result = new ListOfConst(n); } for (int i = 0; i < n; i++) { result.Add(op(arrA[i], arrB[i])); } } else { return(new ArgumentOutOfRangeException("binaryOp: arguments dimensions mismatch").Wrap()); } return(result); } catch (Exception ex) { return(ex.Wrap()); }// new Exception(string.Format("binaryOp: " + ex.Message)); } }