GetHelperObject nun aehnlich filter()
GetHelperObject() wurde umgebaut, um eine aehnliche
Signatur und ein aehnliches Verhalten wie ein
filter() ueber die jeweilige P_*_HELPER Property zu
haben.
Change-Id: I43da08835fcfba0a20716d027ee8bd123d682a02
diff --git a/std/living/helpers.c b/std/living/helpers.c
index 26c94e5..e029827 100644
--- a/std/living/helpers.c
+++ b/std/living/helpers.c
@@ -147,23 +147,36 @@
return deep_copy(Query(P_HELPER_OBJECTS,F_VALUE));
}
-public varargs object GetHelperObject(int type, int|closure strength)
+public varargs object GetHelperObject(int type, int|closure strength,
+ varargs mixed* extra)
{
object ob;
- // Wir brauchen strength als kleineren Wert, als den minimal akzeptierten,
- // damit wir mit > arbeiten koennen, ist meistens egal, aber wenn kein
- // Wert uebergeben wird ist strength = 0, in dem Fall duerfte aber
- // mehrheitlich 1 gemeint sein.
- --strength;
- foreach(closure cl : Query(P_HELPER_OBJECTS)[type]-({0}))
+ // Wenn kein Wert uebergeben wird ist strength 0, in dem Fall duerfte aber
+ // mehrheitlich 1 gemeint sein. Daher auf 1 setzen, wenn 0 uebergeben wurde.
+ strength ||= 1;
+
+ if (intp(strength))
{
- if((intp(strength) &&
- funcall(cl,this_object(),previous_object())>strength) ||
- (closurep(strength) && funcall(strength,this_object(),cl)))
+ foreach(closure cl : Query(P_HELPER_OBJECTS)[type]-({0}))
{
- ob=get_type_info(cl,2);
- break;
+ if(funcall(cl, this_object(), previous_object()) >= strength)
+ {
+ return get_type_info(cl,2);
+ }
}
}
- return ob;
+ else
+ {
+ foreach(closure cl : Query(P_HELPER_OBJECTS)[type]-({0}))
+ {
+ ob=get_type_info(cl,2);
+ if(apply(strength, ob, funcall(cl, this_object(), previous_object()),
+ extra) )
+ {
+ return ob;
+ }
+ }
+ }
+
+ return 0;
}