/** * Iterate over all elements in the object and find all elements for which the matching function is true. * The match is called with the following signature: * * function match(arrayElement: Object, elementIndex: Number, arr: Array): Boolean * * @param match Matching function * @return Returns a new array containing all matching elements. */ static EjsVar *findAll(Ejs *ejs, EjsArray *ap, int argc, EjsVar **argv) { EjsVar *funArgs[3]; EjsBoolean *result; EjsArray *elements; int i; mprAssert(argc == 1 && ejsIsFunction(argv[0])); elements = ejsCreateArray(ejs, 0); if (elements == 0) { ejsThrowMemoryError(ejs); return 0; } for (i = 0; i < ap->length; i++) { funArgs[0] = ap->obj.properties.slots[i]; /* Array element */ funArgs[1] = (EjsVar*) ejsCreateNumber(ejs, i); /* element index */ funArgs[2] = (EjsVar*) ap; /* Array */ result = (EjsBoolean*) ejsRunFunction(ejs, (EjsFunction*) argv[0], 0, 3, funArgs); if (result == 0 || !ejsIsBoolean(result) || !result->value) { setArrayProperty(ejs, elements, elements->length, ap->obj.properties.slots[i]); } } return (EjsVar*) elements; }
/* * Clone an array. * * function clone(deep: Boolean = false) : Array */ static EjsArray *cloneArrayMethod(Ejs *ejs, EjsArray *ap, int argc, EjsVar **argv) { bool deep; mprAssert(argc == 0 || ejsIsBoolean(argv[0])); deep = (argc == 1) ? ((EjsBoolean*) argv[0])->value : 0; return cloneArray(ejs, ap, deep); }
/** Get a boolean representation of a variable. @return Returns a number variable or null if an exception is thrown. */ EjsBoolean *ejsToBoolean(Ejs *ejs, EjsVar *vp) { if (vp == 0 || ejsIsBoolean(vp)) { return (EjsBoolean*) vp; } if (vp->type->helpers->castVar) { return (EjsBoolean*) (vp->type->helpers->castVar)(ejs, vp, ejs->booleanType); } ejsThrowInternalError(ejs, "CastVar helper not defined for type \"%s\"", vp->type->qname.name); return 0; }
static EjsVar *castBooleanVar(Ejs *ejs, EjsBoolean *vp, EjsType *type) { mprAssert(ejsIsBoolean(vp)); switch (type->id) { case ES_Number: return (EjsVar*) ((vp->value) ? ejs->oneValue: ejs->zeroValue); case ES_String: return (EjsVar*) ejsCreateString(ejs, (vp->value) ? "true" : "false"); default: ejsThrowTypeError(ejs, "Can't cast to this type"); return 0; } }