Made some internal changes to make code more scala idiomatic

It's generally idiomatic scala to omit the parens in nullary method
definitions in scala and also omit their use when calling them.

Enumerations are typically taboo as they're value semantics and don't
enable the type checker (or your IDE) to help you out and provide safety.
Sealed trait ADTs are generally the prefered method instead.

Using polymorphism of the ADT via toString is also a more fluent and
reusable approach then pattern matching out an algorithm string manually
in the chain method. It also encourages good seperation of concerns and
will allow you to add additional algorithms later with less code changes.