mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2025-12-20 15:12:19 +00:00
50 lines
1.4 KiB
Plaintext
50 lines
1.4 KiB
Plaintext
#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
|