packages feed

aws-lambda-haskell-runtime-1.0.3: src/Aws/Lambda/ThHelpers.hs

module Aws.Lambda.ThHelpers where

import Relude
import Language.Haskell.TH

-- | Helper for defining names in declarations
-- think of @myValue@ in @myValue = 2@
pName :: Text -> Q Pat
pName = pure . VarP . mkName . toString

-- | Helper for defining names in expressions
-- think of @myFunction@ in @quux = myFunction 3@
eName :: Text -> Q Exp
eName = pure . VarE . mkName . toString

-- | Helper for extracting fields of records
-- think of @personAge@ in @myFunction Person { personAge = personAge } = ...@
fName :: Text -> Q FieldPat
fName name = pure (mkName $ toString name, VarP $ mkName $ toString name)

-- | Helper for extracting fields of a specified record
-- it expects the constructor name as the first parameter,
-- and the list of fields to bring into scope as second
-- think of @Person@, and @personAge@, @personName@ in
-- @myFunction Person { personAge, personName } = ...@
recordQ :: Text -> [Text] -> Q Pat
recordQ name fields = do
  extractedFields <- traverse fName fields
  pure $ RecP (mkName $ toString name) extractedFields