* declare recursive functions and types first * then reuse in module * recurse modules have some overhead with the way ocaml construct them