# corecursive-main Functional programmers are used to program with (co-)recursive functions. What if the main program was itself recursive? One could benefit the underlying operating system scheduler to orchestrate resources. For instance, limiting memory, file-descriptor on a per-recursive-call basis. Another instance is supporting distributed computations across multiple machines. ## This package This package demonstrates the idea of replacing the main entry-point of the program (i.e., `main :: IO ()`) with a recursion-aware main. The program first pattern matches on an "argument". This argument defines which action to take for the rest of the program. The rest of the program runs with a "Self-reference", which allows the program to call itself back. Explicitly passing a Self-reference is very similar to how the `fix` function allows to factor recursion out of the body of a self-referential function. Unlike `fix`, which executes recursive-call in the same memory-space as the call-site, developper using this package need to teach the program to transfer arguments and return values back-and-forth the call-site and the execution site. This package minimizes the developper effort to perform this translation. Currently, one mode is supported: spawning a child process on the same OS while serializing arguments over the command-line parameters. Future versions of this package or sibling packages will likely provide: - support for 'JSON' or 'Dhall' serialization format - support for 'stdin' or networked serialization mechanisms - remote calls using `ssh` ## Envisionned usages Distributed computating: - run a same copy of the program on many places, each on a subset of the data (much like Map/Reduce) Dev/Ops: - use a single binary to reconfigure the whole datacenter and services after a cataclysmic outage (see #History) as well - orchestrate processes locally ## History This package is factored out of code and findings made while writing [DepTrack](https://github.com/lucasdicioccio/deptrack-project). If you like this package you may find other interesting ideas in DepTrack.