1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DefaultSignatures #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies #-}
module HTransExample where
import Generics.SOP
class IsTupleTypeOf xs y | xs -> y where
toTuple :: NP I xs -> y
default toTuple :: (Generic y, Code y ~ '[ xs ]) => NP I xs -> y
toTuple = to . SOP . Z
instance IsTupleTypeOf '[] ()
instance IsTupleTypeOf '[x1] x1 where toTuple = unI . hd
instance IsTupleTypeOf '[x1, x2] (x1, x2)
instance IsTupleTypeOf '[x1, x2, x3] (x1, x2, x3)
instance IsTupleTypeOf '[x1, x2, x3, x4] (x1, x2, x3, x4)
convert :: (AllZip IsTupleTypeOf xss ys) => NS (NP I) xss -> NS I ys
convert = htrans (Proxy :: Proxy IsTupleTypeOf) (I . toTuple)
convertFull :: (Generic a, AllZip IsTupleTypeOf (Code a) ys) => a -> NS I ys
convertFull = convert . unSOP . from
|