Add class and functional implementations
Add tests.
Versionify everything