#include
"share/atspre_staload.hats"
datasort tlist = tnil
| tcons of (t0ype, tlist)
extern fun {t:tlist} foo(): void
extern fun {a:t0ype} foo$fopr(): void
implement foo<tnil>() = ()
implement(a,ts) foo<tcons(a,ts)>() = {
val () = foo$fopr<a>()
val () = foo<ts>()
val () = ignoret (1)
}
implement main0 () = let
implement foo$fopr<int>() = println!("int")
implement foo$fopr<string>() = println!("string")
implement foo$fopr<bool>() = println!("bool")
val () = println!("test 1: should print int, string")
val () = foo<tcons(int, tcons(string, tnil))>()
val () = println!("test 2: should print bool, int")
val () = foo<tcons(bool, tcons(int, tnil))>()
in
end