packages feed

tuple-hlist-0.1.0.0: Tools/generateInstances.hs

module Main where

import System.Environment (getArgs)
import Data.List (intercalate)

main :: IO ()
main = do
  a <- getArgs
  let n = read $ head a
  putStrLn $ generateInstances [2..n]

generateInstances :: [Int] -> String
generateInstances is = intercalate "\n\n" $ map generateInstance is

generateInstance :: Int -> String
generateInstance i = intercalate "\n" [instanceStr, toHListStr, fromHListStr]
  where instanceStr    = "instance HLst " ++ tupleType ++ " " ++ hlistType ++ " where"
        toHListStr     = indent ++ "toHList " ++ tuplePattern ++ " = " ++ hlistConstruct
        fromHListStr   = indent ++ "fromHList " ++ hlistPattern ++ " = " ++ tupleConstruct
        indent         = take 4 $ repeat ' '
        vars           = ["a" ++ show j | j <- [1..i]]
        tuple          = "(" ++ intercalate ", " vars ++ ")"
        tupleType      =  tuple
        tuplePattern   = tuple
        tupleConstruct = tuple
        hlistType      = "(" ++ intercalate " :*: " (vars ++ ["HNil"]) ++ ")"
        hlistPattern   = intercalate " " (map ("(HCons "++) vars) ++ " HNil" ++ take i (repeat ')')
        hlistConstruct = "hEnd $ hBuild " ++ unwords vars