// Autogenerated with DRAKON Editor 1.29
import std.range;

// This part goes to the beginning of the file.

import std.stdio;

class Foo {

	private const int N;



const int add(int a, int b) {
    // item 6
    return a + b;
}

void alt_select_test() {
    // item 109
    alternative_select(-100, -1);
    alternative_select(100, 1);
    alternative_select(0, 0);
}

void alternative_select(int value, int expected) {
    // item 117
    int actual;
    // item 1180001
    if (value < 0) {
        // item 126
        actual = -1;
    } else {
        // item 1180002
        if (value == 0) {
            // item 127
            actual = 0;
        } else {
            // item 128
            actual = 1;
        }
    }
    // item 129
    if (actual == expected) {
        
    } else {
        // item 135
        throw new 
        Exception("alt select failure!\n");
    }
    // item 1390001
    if (value < 0) {
        // item 147
        actual = -1;
    } else {
        // item 1390002
        if (value == 0) {
            // item 148
            actual = 0;
        } else {
            // item 1390003
            if (value > 0) {
                
            } else {
                // item 1390004
                throw new Exception("Not expected condition.");
            }
            // item 149
            actual = 1;
        }
    }
    // item 150
    if (actual == expected) {
        
    } else {
        // item 153
        throw new 
        Exception("alt select failure!\n");
    }
}

private pure int clamp(int value, int low, int high) {
    // item 19
    if (value < low) {
        // item 22
        return low;
    } else {
        // item 23
        if (value > high) {
            // item 26
            return high;
        } else {
            // item 27
            return value;
        }
    }
}

this(int n) {
    // item 71
    N = n;
    // item 77
    writeln("Hello from the constructor!");
}

~this() {
    // item 76
    writeln("Hello from the destructor!");
}

static pure int[] fibonacci(int n) {
    // item 12
    int[] result = 
     new int[n + 1];
    // item 41
    result[0] = 0;
    // item 280001
    if (n == 0) {
        
    } else {
        // item 280002
        if (n == 1) {
            // item 36
            result[1] = 1;
        } else {
            // item 42
            result[1] = 1;
            // item 380001
            int i = 2;
            while (true) {
                // item 380002
                if (i <=n) {
                    
                } else {
                    break;
                }
                // item 40
                int fib = 
                 result[i - 2] + result[i - 1];
                // item 43
                result[i] = fib;
                // item 380003
                i++;
            }
        }
    }
    // item 13
    return result;
}

int foreachEarlyExit(int value) {
    // item 192
    int found = -1;
    int normal_176;
    normal_176 = 1;
    foreach (int x; [10, 20, 30]) {
        // item 180
        if (x == value) {
            // item 184
            found = x;
            normal_176 = 0;
            break;
        } else {
            
        }
    }
    if (normal_176 == 1) {
        // item 183
        found = 0;
    }
    foreach (int x; [40, 20, 70]) {
        // item 191
        int m = x / 2;
        // item 186
        if (m == value) {
            // item 190
            return x + found;
        } else {
            
        }
    }
    // item 189
    return 0;
}

static void iterate_arrow(const(int)[] numbers) {
    // item 86
    int i = 0;
    while (true) {
        // item 83
        if (i < numbers.length) {
            
        } else {
            break;
        }
        // item 102
        write(numbers[i]);
        write(" ");
        // item 89
        i++;
    }
    // item 103
    writeln();
}

static void iterate_arrow2(const(int)[] numbers) {
    // item 97
    int i = 0;
    while (true) {
        // item 99
        write(numbers[i]);
        write(" ");
        // item 100
        i++;
        // item 95
        if (i < numbers.length) {
            
        } else {
            break;
        }
    }
    // item 101
    writeln();
}

void run() {
    // item 51
    int[] numbers = fibonacci(N);
    foreach (i; numbers[]) {
        // item 48
        write(i);
        write(" ");
    }
    // item 53
    writeln();
    // item 104
    iterate_arrow(numbers);
    iterate_arrow2(numbers);
    // item 154
    alt_select_test();
    // item 204
    testEarly(20, 60);
    // item 205
    testEarly(35, 70);
    // item 206
    testEarly(4, 0);
    foreach (int i, int n; numbers) {
        // item 159
        writefln("%d:%d ", i, n);
    }
    // item 162
    writeln();
    foreach (i2; numbers) {
        // item 63
        int clamped = clamp(i2, 50, 400);
        // item 60
        write(clamped);
        write(" ");
    }
    // item 65
    writeln();
}

void testEarly(int value, int expected) {
    // item 199
    int actual = foreachEarlyExit(value);
    // item 200
    if (actual == expected) {
        
    } else {
        // item 203
        throw new Exception("foreach_early_exit failed");
    }
}

// This part goes to the end of the file.


} // End of class Foo.

// Символы Юникод

void main()
{
	auto f = new Foo(20);
	f.run();
}
