Skip to content

foreach() loop implementation for GameMaker 2.3 for arrays, ds_lists, ds_maps, ds_stacks, ds_queues, ds_priorities and structs

License

Notifications You must be signed in to change notification settings

KeeVeeGames/foreach.gml

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 
 
 
 
 

Repository files navigation

foreach.gml

Donate License

It is a foreach() loop implementation for GameMaker: Studio 2.3+ for arrays, ds_lists, ds_maps, ds_stacks, ds_queues, ds_priorities and structs.
Note: queue-type data structures such as stacks, queues, and priorities will be empty after full foreach pass.

The general syntax is:

foreach(collection as (item) {
    // do things with item
});

You also can receive additional parameters such as iteration index, key for map, priority for priority queue, and property name for a struct, specifying it inside as keyword brackets after item var.

Installation:

Get the latest asset package from the releases page. Import it into IDE.
Alternatively copy the code from corresponding scripts into your project.

Examples:

Foreach in array:

var apples = ["red", "green", "yellow", "mac", "forbidden"];

foreach(apples as (apple, i) {
    show_debug_message(string(i) + ": " + apple);
});

Output:

0: red
1: green
2: yellow
3: mac
4: forbidden

Foreach in struct:

var apples = { red : "delicious", green : "eww", yellow : "yum" };

foreach_struct(apples as (taste, color) {
    show_debug_message(color + " is " + taste);
});

Output:

yellow is yum
red is delicious
green is eww

Foreach in list:

var apples = ds_list_create();
ds_list_add(apples, "red", "green", "yellow", "mac", "forbidden");

foreach_list(apples as (apple, i) {
    show_debug_message(string(i) + ": " + apple);
});

Output:

0: red
1: green
2: yellow
3: mac
4: forbidden

Foreach in map:

var apples = ds_map_create();
ds_map_add(apples, "red", "delicious");
ds_map_add(apples, "green", "eww");
ds_map_add(apples, "yellow", "yum");

foreach_map(apples as (taste, color) {
    show_debug_message(color + " is " + taste);
});

Output:

yellow is yum
red is delicious
green is eww

Foreach in stack:

var apples = ds_stack_create();
ds_stack_push(apples, "red", "green", "yellow", "mac", "forbidden");

foreach_stack(apples as (apple, i) {
    show_debug_message(string(i) + ": " + apple);
});

Output:

0: forbidden
1: mac
2: yellow
3: green
4: red

Foreach in queue:

var apples = ds_queue_create();
ds_queue_enqueue(apples, "red", "green", "yellow", "mac", "forbidden");

foreach_queue(apples as (apple, i) {
    show_debug_message(string(i) + ": " + apple);
});

Output:

0: red
1: green
2: yellow
3: mac
4: forbidden

Foreach in priority:

var apples = ds_priority_create();
ds_priority_add(apples, "red", 10);
ds_priority_add(apples, "green", 30);
ds_priority_add(apples, "yellow", 20);

foreach_priority(apples as (apple, priority) {
    show_debug_message(string(priority) + ": " + apple);
});

Output:

30: green
20: yellow
10: red

Break:

You can add breakeach keyword in that foreach with a hacky modification, but it's not recommended as a foreach loop is not intended to be breakable.

#macro breakeach breakme[@ 0] = true;

function foreach(array, func) {
    var breakme = array_create(1);
    breakme[0] = false;
    
    var size = array_length(array);
    
    for (var i = 0; i < size; i++) {
        if (breakme[0] == true) break;
        
        var element = array[i];
        func(element, i, breakme);
    }
}

var apples = ["red", "green", "yellow", "mac", "forbidden"];

foreach(apples as (apple, i, breakme) {
    show_debug_message(apple);
    
    if (i == 2) breakeach;
});

Author:

Nikita Musatov - MusNik / KeeVee Games

License: MIT