use "loops-streams-tests.ml";
open Streams;

fun streamTests() =
let
    (*
     * A streamified list.
     *)
    val ls = newStream(1,[1,2,3],hd,tl,null);

    (*
     * A streamified string.
     *)
    val ss = newStream("x","xyz",fn(x)=>substring(x,0,1),
	fn(x)=>substring(x,1,size(x)-1),fn(x)=>size(x)=0);

    (*
     * A more efficient streamified string.
     *)
    val ess = sstream("xyz");

    (*
     * The infinite stream of non-negative ints.
     *)
    val is = newStream(0,0,fn(x)=>x,fn(x)=>x+1,fn(x)=>false);

    (*
     * The input stream for the file test.dat.
     *)
    val indat = fstream("test.dat")

    fun printn(x) = (print(x); print("\n"))
    fun printbn(x) = (print(x); print("\n"))
in
    printn(shd(ls));
    printn(shd(stl(ls)));
    printn(shd(stl(ls)));	(* Demo ref trans'y *)
    printn(snth(ls, 2));
    printbn(snull(stl(stl(stl(ls)))):bool);
    printn(shd(snil):int) handle Shd => print("Shd raised.\n");
    printn(shd(stl(stl(stl(stl(ls)))))) handle Stl => print("Stl raised.\n");
    printn(snth(ls, 3)) handle Snth => print("Snth raised.\n");
    sforeach(ess, "", fn(x,s)=>
        (print(x);x));
    print("\n");
    print("\n" ^ sforeach(ess, "", fn(x,s)=>(print(x);x)) ^ "\n");
    sforeach(lstream(sforeachl(ess, "", fn(x,s)=>x^"!")), nil, fn(x,s)=>
	(print(x^"\n");nil))
end