data Location (area :: Area) (section :: Section) where
Area :: KnownSymbol area => Proxy area -> Location area Nothing
Location :: (KnownSymbol area, KnownSymbol n) => Proxy area -> Proxy n -> Location area (Just n)
type Area = Symbol
type Section = Maybe Symbol
symbolVal $ Proxy @a
symbolVal $ Proxy @b
symbolVal $ Proxy @(ToLocation a b)
type family ToLocation (a :: Area) (b :: Section) :: Symbol where
ToLocation x 'Nothing = x
ToLocation x ('Just y) = AppendSymbol x (AppendSymbol " - " y)