﻿:: { n:i8, s:i8*, b:b, ia:ia, r8:r8, r4:r4, u4:u4, u8:u8, i8:i8, t:s }

Range(n)
Range(3)
Range(n, n)
Range(3, 10)
Range(3, 3)
Range(3, 2)
Range(3, n)
Range(n, n, n)
Range(3, 10, 2)
Range(10, 3, -2)
Range(3, 10, 0)
Range(3, n, 1)
Range(3, n, n)
Range(3, 10, n)

Sequence(n)
Sequence(3)
Sequence(0)
Sequence(-3)
Sequence(n, n)
Sequence(3, 10)
Sequence(3, 3)
Sequence(3, 2)
Sequence(3, n)
Sequence(n, n, n)
Sequence(3, 10, 2)
Sequence(10, 3, -2)
Sequence(3, 10, 0)
Sequence(3, n, 1)
Sequence(3, n, n)
Sequence(3, 10, n)

Sequence(n, ia)
Sequence(3, ia)
Sequence(n, u4)
Sequence(3, u4)
Sequence(n, u8)
Sequence(3, u8)
Sequence(n, r8)
Sequence(3, r8)
Sequence(n, r8)
Sequence(3, t)
Sequence(n, t)
Sequence(3, t, r8)
Sequence(n, t, r8)
Sequence(n, ia, r8)
Sequence(n, r8, ia)
Sequence(n, u8, i8)
Sequence(n, i8, u8)
Sequence(n, u4, i8)
Sequence(n, r4, i8)

Repeat("hi", n)
Repeat("hi", 10)
Repeat("hi", 0)
Repeat("hi", -5)

ForEach(s, it * it)
ForEach(Range(5), it * it)
ForEach(x:Range(5), y:Range(5, 15), x * y)
ForEach(y:Range(5, 15), x:Range(5), x * y)
ForEach(x:Range(5), y:s, x * y)
ForEach(y:s, x:Range(5), x * y)

ForEachIf(Range(5), true, it * it)
ForEach(Range(5), [if] true, it * it)
ForEachIf(Range(5), false, it * it)
ForEach(Range(5), [if] false, it * it)
ForEachIf(Range(5), it > 3, it * it)
ForEach(Range(5), [if] it > 3, it * it)

ForEachWhile(Range(5), true, it * it)
ForEach(Range(5), [while] true, it * it)
ForEachWhile(Range(5), false, it * it)
ForEach(Range(5), [while] false, it * it)
ForEachWhile(Range(5), it > 3, it * it)
ForEach(Range(5), [while] it > 3, it * it)

ForEachIf(x:Range(5), y:Range(5, 15), true, x * y)
ForEachIf(x:If(7 < 5, Range(3), Range(5)), y: Range(5, 15), true, x * y)
ForEachIf(x:If(7 < 5, s ++ Range(3), Range(5)), y:s ++ Range(5, 15), true, x * y)
ForEach(x:Range(5), y:Range(5, 15), [if] true, x * y)
ForEach(x:If(7 < 5, Range(3), Range(5)), y: Range(5, 15), [if] true, x * y)
ForEach(x:If(7 < 5, s ++ Range(3), Range(5)), y:s ++ Range(5, 15), [if] true, x * y)
ForEachIf(y:Range(5, 15), x:Range(5), true, x * y)
ForEach(y:Range(5, 15), x:Range(5), [if] true, x * y)
ForEachIf(x:Range(5), y:Range(5, 15), false, x * y)
ForEach(x:Range(5), y:Range(5, 15), [if] false, x * y)
ForEachIf(y:Range(5, 15), x:Range(5), false, x * y)
ForEach(y:Range(5, 15), x:Range(5), [if] false, x * y)
ForEachIf(x:Range(5), y:Range(5, 15), x + y < 10, x * y)
ForEach(x:Range(5), y:Range(5, 15), [if] x + y < 10, x * y)
ForEachIf(y:Range(5, 15), x:Range(5), x + y < 10, x * y)
ForEach(y:Range(5, 15), x:Range(5), [if] x + y < 10, x * y)

ForEachWhile(x:Range(5), y:Range(5, 15), true, x * y)
ForEachWhile(x:Range(10)->Drop(5)->Drop(2, [if] it > 2), y: Range(5, 15), true, x * y)
ForEachWhile(x:If(7 < 5, s ++ Range(3), Range(5)), y:s ++ Range(5, 15), true, x * y)
ForEach(x:Range(5), y:Range(5, 15), [while] true, x * y)
ForEach(x:Range(10)->Drop(5)->Drop(2, [if] it > 2), y: Range(5, 15), [while] true, x * y)
ForEach(x:If(7 < 5, s ++ Range(3), Range(5)), y:s ++ Range(5, 15), [while] true, x * y)
ForEachWhile(y:Range(5, 15), x:Range(5), true, x * y)
ForEach(y:Range(5, 15), x:Range(5), [while] true, x * y)
ForEachWhile(x:Range(5), y:Range(5, 15), false, x * y)
ForEach(x:Range(5), y:Range(5, 15), [while] false, x * y)
ForEachWhile(y:Range(5, 15), x:Range(5), false, x * y)
ForEach(y:Range(5, 15), x:Range(5), [while] false, x * y)
ForEachWhile(x:Range(5), y:Range(5, 15), x + y < 10, x * y)
ForEach(x:Range(5), y:Range(5, 15), [while] x + y < 10, x * y)
ForEachWhile(y:Range(5, 15), x:Range(5), x + y < 10, x * y)
ForEach(y:Range(5, 15), x:Range(5), [while] x + y < 10, x * y)

Generate(n, it * it)
Generate(5, it * it)
Generate(-1, it * it)
Generate(0, it * it)
Generate(x:n, y:n, x + y)
Generate(x:5, y:n, x + y)
Generate(x:-1, y:n, x + y)
Generate(x:0, y:n, x + y)
Generate(x:n, y:n, x + y, y - 1)
Generate(x:5, y:n, x + y, y - 1)
Generate(x:-1, y:n, x + y, y - 1)
Generate(x:0, y:n, x + y, y - 1)

Sort(s)
Sort(Range(20))
Sort(Range(5) + s)
Sort(Range(5) ++ s)
Sort(Take(s, 5))

Distinct(s)
Distinct(Range(20))
Distinct(Range(5) + s)
Distinct(Range(5) ++ s)
Distinct(Take(s, 5))

ScanX(a:s, b:0, a + b)
ScanX(a:Range(10), b:0, a + b)
ScanZ(a:s, b:0, a + b)
ScanZ(a:Range(10), b:0, a + b)
