This library provides utilities for working with existential types and type-level constraints.
It allows you to enforce multiple constraints on polymorphic types and containers complementing some.
Core
Existential types: Somes and Somes1 provide existential wrappers for types with multiple constraints.
Convenient aliases: Simplified types Some and Some1 for scenarios where just one constraint is needed.
More convenient aliases: Simplified types SomeF and SomesF for scenarios where the container of a Somes1 is known.
Natural transformations with constraints
mapSome :: (forall a. AllC csa a => f a -> g a) -> SomesF f csa -> SomesF g csa
traverseSome :: Functor m => (forall a. AllC csa a => f a -> m (g a)) -> SomesF f csa -> m (SomesF g csa)