implemented Semigroup and Functor, kinda