gluon 0.18.2

A static, type inferred programming language for application embedding
Documentation
extern crate env_logger;

extern crate gluon;

#[macro_use]
mod support;

test_expr! { array,
r#"
let array = import! std.array.prim
let arr = [1,2,3]

array.index arr 0 #Int== 1
    && array.len arr #Int== 3
    && array.len (array.append arr arr) #Int== array.len arr #Int* 2"#,
true
}

test_expr! { array_byte,
r#"
let array = import! std.array.prim
let arr = [1b,2b,3b]

let b = array.index arr 2 #Byte== 3b && array.len arr #Int== 3
let arr2 = array.append arr arr
b && array.len arr2 #Int== array.len arr #Int* 2
  && array.index arr2 1 #Byte== array.index arr2 4
"#,
true
}

test_expr! { array_float,
r#"
let array = import! std.array.prim
let arr = [1.0,2.0,3.0]

let b = array.index arr 2 #Float== 3.0 && array.len arr #Int== 3
let arr2 = array.append arr arr
b && array.len arr2 #Int== array.len arr #Int* 2
  && array.index arr2 1 #Float== array.index arr2 4
"#,
true
}

test_expr! { array_data,
r#"
let array = import! std.array.prim
let arr = [{x = 1, y = "a" }, { x = 2, y = "b" }]

let b = (array.index arr 1).x #Int== 2 && array.len arr #Int== 2
let arr2 = array.append arr arr
b && array.len arr2 #Int== array.len arr #Int* 2
"#,
true
}

test_expr! { array_array,
r#"
let array = import! std.array.prim
let arr = [[], [1], [2, 3]]

let b = array.len (array.index arr 1) #Int== 1 && array.len arr #Int== 3
let arr2 = array.append arr arr
b && array.len arr2 #Int== array.len arr #Int* 2
"#,
true
}

// Test that empty variants are handled correctly in arrays
test_expr! { array_empty_variant,
r#"
let array = import! std.array.prim
type Test = | Empty | Some Int
let arr = [Empty, Some 1]
match array.index arr 0 with
| Empty -> 0
| Some x -> x
"#,
0i32
}

// Test that array append handles array types correctly
test_expr! { array_empty_append,
r#"
let array = import! std.array.prim
type Test = | Empty | Some Int
let arr = array.append [] [Empty, Some 1]
match array.index arr 0 with
| Empty -> 0
| Some x -> x
"#,
0i32
}

test_expr! { array_load,
r#"
let array = import! std.array
0
"#,
0i32
}

test_expr! { array_fold,
r#"
let array = import! std.array
array.foldable.foldl (\x y -> y.x) 0 [{ x = 4 }]
"#,
4
}