Data.OpenUnion
data Union r a
class Weakens q
type family xs :++: ys where ...
decomp
weaken
extract
class Member eff effs
type family Members effs effs' :: Constraint where ...
class LastMember m effs