module Data.Inhabited.TH where



import Language.Haskell.TH

import Language.Syntactic.TH



inhabitedTupleInstances :: Int -> DecsQ
inhabitedTupleInstances n = return
    [ instD
        [AppT (ConT (mkName "Inhabited")) (VarT a) | a <- take w varSupply]
        ( AppT
            (ConT (mkName "Inhabited"))
            (foldl AppT (TupleT w) (map VarT $ take w varSupply))
        )
        [ FunD
            (mkName "example")
            [ Clause
                []
                (NormalB $ TupE $ map VarE $ replicate w (mkName "example"))
                []
            ]
        ]
      | w <- [2..n]
    ]