I have been playing around with Nikita Volkov’s Refined library. Refined provides composable type level combinators for building smart constructors refining an existing type.