| {-# Language UndecidableInstances, DataKinds, DeriveGeneric, TypeFamilies #-}
|
| module Z where
|
|
|
| import GHC.Generics
|
| import Data.Kind
|
| import GHC.Exts
|
|
|
| type family Field' (s :: Symbol) (f :: Type -> Type) :: Maybe Type where
|
| Field' s (D1 c f) = Field' s f
|
| Field' s (C1 c f) = Field' s f
|
| Field' s (S1 (MetaSel ('Just s) _ _ _) (K1 _ a)) = 'Just a
|
| Field' s (S1 (MetaSel _ _ _ _) _) = 'Nothing
|
| Field' s (f :*: g) = Or (Field' s f) (Field' s g)
|
|
|
| type family Or a b where
|
| Or ('Just x) _ = 'Just x
|
| Or _ ('Just x) = 'Just x
|
| Or _ _ = 'Nothing
|
|
|
| data Demo = Demo { marco :: Int, polo :: Char }
|
| deriving Generic
|