#define PREPARE_INPUT \ predicates = istype(predicates) ? predicates : list(predicates);\ input = istype(input) ? input : list(input); #define PREPARE_ARGUMENTS \ var/extra_arguments = predicates[predicate];\ var/list/predicate_input = input;\ if(LAZYLEN(extra_arguments)) {\ predicate_input = predicate_input.Copy();\ predicate_input += list(extra_arguments);\ } /proc/all_predicates_true(var/list/input, var/list/predicates) PREPARE_INPUT for(var/predicate in predicates) PREPARE_ARGUMENTS if(!call(predicate)(arglist(predicate_input))) return FALSE return TRUE /proc/any_predicate_true(var/list/input, var/list/predicates) PREPARE_INPUT if(!predicates.len) return TRUE for(var/predicate in predicates) PREPARE_ARGUMENTS if(call(predicate)(arglist(predicate_input))) return TRUE return FALSE /proc/can_not_locate(var/atom/container, var/container_thing) return !(locate(container_thing) in container) // We could just do !can_locate(container, container_thing) but BYOND is pretty awful when it comes to deep proc calls /proc/where(var/list/list_to_filter, var/list/predicates, var/list/extra_predicate_input) . = list() for(var/entry in list_to_filter) var/predicate_input if(extra_predicate_input) predicate_input = (list(entry) + extra_predicate_input) else predicate_input = entry if(all_predicates_true(predicate_input, predicates)) . += entry #undef PREPARE_ARGUMENTS #undef PREPARE_INPUT