"I want to believe" commit.
Not only Theory, but also Task and Transformation do not need to depend on environment. Moreover, we don't have to track the clone history in tasks. The only thing we need to do, is to provide three registration functions in Driver, namely: val register_transform : string -> (unit -> task_t) -> unit val register_transform_env : string -> (env -> task_t) -> unit val register_transform_clone : string -> (env -> clone -> task_t) -> unit and then another three for task_list_t. Then any particular transformation that is going to depend on environment or clone_history, must register itself via the appropriate registration function. It will be the responsibility of Driver to recreate the transformation for every new environment and/or clone history. It will be easy, given that both [env] and [clone] are physically comparable and provide a unique tag. Thus, the generic interface provided by Transform can be completely independent on [env] and [clone]. This commit implements the proposed interface of Task and moves the environment stuff into a separate module.