{-# LANGUAGE TypeFamilies #-}
class Key k where
data Map k :: * -> *
empty :: Map k v
lookup :: k -> Map k v -> Maybe v
instance Key Bool where
data Map Bool v = MapBool (Maybe v) (Maybe v)
empty = MapBool Nothing Nothing
lookup True (MapBool _ t) = t
lookup False (MapBool f _) = f
main = putStrLn "Hello World!"