packages feed

quick-process-0.0.3: src/System/Process/Quick/CallSpec/Init.hs

module System.Process.Quick.CallSpec.Init where

import Language.Haskell.TH as TH
import System.Process.Quick.CallArgument
import System.Process.Quick.CallSpec
import System.Process.Quick.Prelude
import TH.Utilities qualified as TU

data Init cs = Init deriving (Show, Eq, Ord, Data)

instance CallSpec cs => CallArgumentGen (Init cs) where
  cArgName _ = Nothing
  -- Exp type is '\v -> [String]'
  progArgExpr _ = [| const [] |]
  fieldExpr _ = pure Nothing
  -- | Exp type is '\v -> m [CsBox]'
  initCallSpecsExpr _ = do
    -- [| const (sequence [generate (arbitrary @cs)]) |]
    trep <- QR $ lift $ TU.typeRepToType (typeRep (Proxy @cs))
    pure (AppE (VarE 'const)
          (AppE (VarE 'liftIO)
            (AppE (VarE 'sequence)
              (ListE
                [ AppE
                  (AppE (VarE 'fmap) (ConE 'CsBox))
                  (AppE (VarE 'generate)
                    (AppTypeE (VarE 'arbitrary) trep))
                ]))))