// 02_arrays_objects_functions.fls

fn isEven(x: int): bool
{
    return (x % 2) == 0;
}

fn sq(x: int): int
{
    return x * x;
}

fn Main()
{
    let nums: array = [1, 2, 3, 4, 5, 6];

    // Higher level array helpers - instance method syntax
    let evens: array   = nums.Where(isEven);
    let squares: array = evens.Select(sq);

    // Anonymous functions don't support type annotations yet, so keep it untyped.
    let sum: int = squares.Reduce(fn(acc, x) { return acc + x; }, 0);

    Console.WriteLine("nums   =", nums);
    Console.WriteLine("evens  =", evens);
    Console.WriteLine("sq(ev) =", squares);
    Console.WriteLine("sum    =", sum);

    // Objects / dictionaries
    let user: object = { name: "Lin", active: true, score: 42 };

    // (Optional) typed locals when you want clarity:
    let userName: string = user.name;
    Console.WriteLine("user.name =", userName);

    let hasScore: bool = Object.HasKey(user, "score");
    Console.WriteLine("has score =", hasScore);

    // Safe default lookup (tier may not exist)
    // Return type depends on Object.TryGet; 'any' is the safest annotation here.
    let tier: any = Object.TryGet(user, "tier", "free");
    Console.WriteLine("tier =", tier);

    return;
}
