prairie-0.0.1.0: A first class record field library
Safe HaskellNone
LanguageHaskell2010

Prairie.TH

Description

Helpers for generating instances of the Record type class.

Since: 0.0.1.0

Synopsis

Documentation

mkRecord :: Name -> DecsQ Source #

Create an instance of the Record type class.

data User
  = User
  { name :: String
  , age :: Int
  }

mkRecord ''User

====>

instance Record User where
  data Field User a where
    UserName :: String
    UserAge :: Int

  recordFieldLens fl =
    case fl of
      UserName -> lens name (u n -> u { name = n)
      UserAge -> lens age (u n -> u { age = n)

instance SymbolToField "age" User Int where symbolToField = UserName
instance SymbolToField "name" User String where symbolToField = UserAge

If the fields are prefixed with the type's name, this function figures it out and won't duplicate the field.

data User
  = User
  { userName :: String
  , userAge :: Int
  }

mkRecord ''User

====>

instance Record User where
  data Field User a where
    UserName :: String
    UserAge :: Int

  recordFieldLens fl =
    case fl of
      UserName -> lens name (u n -> u { name = n)
      UserAge -> lens age (u n -> u { age = n)

instance SymbolToField "name" User Int where symbolToField = UserName
instance SymbolToField "age" User String where symbolToField = UserAge

Since: 0.0.1.0