#![recursion_limit="128"]
#[macro_use]
extern crate fungi_lang;
#[test]
fn examples () {
use std::thread;
let child =
thread::Builder::new().stack_size(64 * 1024 * 1024).spawn(move || {
examples2()
});
let _ = child.unwrap().join();
}
fn examples2() {
use std::rc::Rc;
use fungi_lang::ast::*;
use fungi_lang::bitype::*;
use fungi_lang::vis::*;
let max : Exp = fgi_exp![
type Vec = (forallt T:type.user(Vec))
type Seq = (
rec Seq. foralli (X,Y):NmSet. forallt T:type.
(+ Vec T
+ (exists (X1,X2,X3) :NmSet | (X1%X2%X3=X).
exists (Y1,Y2,Y3,Y4):NmSet | (Y1%Y2%Y3%Y4=Y).
x Nm[X1] x Nat
x Ref[Y1](Seq[X2][Y2] T)
x Ref[Y3](Seq[X3][Y4] T))
)
)
let nums:(Seq[X][Y] Nat) = { unimplemented }
let vec_max:(Thk[0] 0 Vec Nat -> 0 F Nat) = {
unimplemented
}
let rec max:(
Thk[0] foralli (X,Y):NmSet.
0 Seq[X][Y] Nat ->
{(#x:Nm.{x,@1} % {x,@2}) X; 0} F Nat
) = {
#seq. unroll seq seq. match seq {
vec => { {force vec_max} vec }
bin => {
let (n,_x,l,r) = {ret bin}
let (unused, ml) = { memo{n,(@1)}{ {force max} {!l} } }
let n1 = {n,(@1)}
let (unused, ml) = { memo(n1){ {force max} {!l} } }
let nf = { ret nmfn #n:Nm.#v:Nm.n,v }
let n2 = { [nf] n (@2) }
let mr = {
let t = { thk n2
let rv = {get r}
{force max} rv
}
{force t}
}
if { mr < ml } {ret ml} else {ret mr}
}
}
}
{force max} nums
];
println!("Max example AST:");
println!("{:?}", max);
let filter : Exp = fgi_exp![
type Vec = (user(Vec))
let vec_filter:( Thk[0]
0 Vec Nat ->
0 (Thk[0] 0 Nat -> 0 F Bool) ->
0 F Vec Nat
) = {
unimplemented
}
let vec_map:( Thk[0]
0 Vec Nat ->
0 (Thk[0] 0 Nat -> 0 F Nat) ->
0 F Vec Nat
) = {
unimplemented
}
type Seq = (
rec Seq. foralli (X,Y):NmSet.
(+ Vec
+ (exists (X1,X2,X3) :NmSet | (X1%X2%X3=X).
exists (Y1,Y2,Y3,Y4):NmSet | (Y1%Y2%Y3%Y4=Y).
x Nm[X1] x Nat
x Ref[Y1](Seq[X2][Y2])
x Ref[Y3](Seq[X3][Y4]))
)
)
let nums:(Seq[X][Y] Nat) = { unimplemented }
let rec max:(
Thk[0] foralli (X,Y):NmSet.
0 Seq[X][Y] Nat ->
{(#x:Nm.{x,@1} % {x,@2}) X; 0} F Nat
) = {
#seq. unroll seq seq. match seq {
vec => { {force vec_max} vec }
bin => {
let (n,_x,l,r) = {ret bin}
let (unused, ml) = { memo{n,(@1)}{ {force max} {!l} } }
let (unused, mr) = { memo{n,(@2)}{ {force max} {!r} } }
if { mr < ml } {ret ml} else {ret mr}
}
}
}
let rec filter:(
Thk[0] foralli (X,Y):NmSet.
0 Seq[X][Y] Nat ->
0 (Thk[0] {0;0} Nat -> 0 F Bool) ->
{(#x:Nm.{x,@1} % {x,@2}) X; 0} F Nat
) = {
#seq. #f. unroll match seq {
vec => { {force vec_filter} f vec }
bin => {
let (n,lev,l,r) = {ret bin}
let (rsl, sl) = { memo{n,(@1)}{ {force filter} f {!l} } }
let (rsr, sr) = { memo{n,(@2)}{ {force filter} f {!r} } }
if {{force is_empty} sl} { ret sr }
else { if {{force is_empty} sr} { ret sl }
else {
ret roll inj2 (n,lev,rsl,rsr)
}
}
}
}
}
let rec map:(
Thk[0] foralli (X,Y):NmSet.
0 Seq[X][Y] Nat ->
0 (Thk[0] 0 Nat -> 0 F Nat) ->
{(#x:Nm.{x,@1} % {x,@2}) X; 0} F Nat
) = {
#seq. #f. unroll match seq {
vec => { {force vec_map } f vec }
bin => {
let (n,lev,l,r) = {ret bin}
let (rsl, sl) = { memo{n,(@1)}{ {force map} f {!l} } }
let (rsr, sr) = { memo{n,(@2)}{ {force map} f {!r} } }
ret roll inj2 (n,lev,rsl,rsr)
}
}
}
{force max} nums
];
println!("Filter example AST:");
println!("{:?}", filter);
println!("Filter example numbered:");
println!("{:?}", label_exp(filter, &mut 0));
println!("Filter example with type info:");
println!("{:?}", synth_exp(None, &TCtxt::Empty, &max));
}