#include<stk.h>
#include<LINK/stkWrapper/LINK_STk.h>
#include<LINK/stkWrapper/Wrapper.h>
#include<LINK/algorithm/Algorithms.h>
#include<LINK/basic/Sequence.h>
#include<LINK/graph/Graph.h>
#include<LINK/graph/Edge.h>

#include <stdio.h>
#include <stdlib.h>

static PRIMITIVE TopologicalSortCmd(SCM g)
{
        Graph *gr;
        if (!(gr = getGraph(g)))
                Err("topsort: bad arg 1, graph expected", g);
        Sequence<Vertex*> s = TopologicalSort(gr);
        Sequence<Vertex*>* sp = new Sequence<Vertex*>(s);

        return STk_make_CXXwrapper(Wrapper<Sequence<Vertex*> >::type,
                Wrapper<Sequence<Vertex*> >::name, (void *) sp, LINK_DYNAMIC);
}

static PRIMITIVE TopologicalSortAnimCmd(SCM g, SCM view) {
    Graph *gr;
    
    if (!(gr = getGraph(g)))
	Err("topsort: bad arg 1, graph expected", g);
    char *name = getViewName(view);
    int k = initAnimation();
    animationWindows(k, name);
    Sequence<Vertex*> s = TopologicalSort(gr,name);
    Sequence<Vertex*>* sp = new Sequence<Vertex*>(s);
    return STk_make_CXXwrapper(Wrapper<Sequence<Vertex*> >::type,
			       Wrapper<Sequence<Vertex*> >::name, (void *) sp, LINK_DYNAMIC);
}

void gen_TopologicalSort_Wrapper()
{
    STk_add_new_cpp_primitive("topsort", tc_subr_1,
			      (PRIMITIVE (*)(...))TopologicalSortCmd);
    STk_add_new_cpp_primitive("topsort*", tc_subr_2,
			      (PRIMITIVE (*)(...))TopologicalSortAnimCmd);
    STk_add_new_cpp_primitive("topological-sort", tc_subr_1,
			      (PRIMITIVE (*)(...))TopologicalSortCmd);
    STk_add_new_cpp_primitive("topological-sort*", tc_subr_2,
			      (PRIMITIVE (*)(...))TopologicalSortAnimCmd);
}
