module MAAM.Initial where

import FP

class Initial a where
  initial :: a
class Inject ς where
  inj :: a -> ς a

instance Inject ID where
  inj = ID

instance (Initial 𝓈) => Inject ((,) 𝓈) where
  inj :: a -> (𝓈, a)
  inj = (initial,)

instance Inject ListSet where
  inj = fromList . single

instance (Inject t, Inject u) => Inject (t :.: u) where
  inj = Compose . inj . inj

instance Initial (Map k v) where
  initial = mapEmpty