HListPP-0.2.2: HListPP.cabal
name: HListPP
version: 0.2.2
synopsis: A preprocessor for HList labelable labels
description: A preprocessor that replaces @`longDescriptiveName@ with
.
> hLens' (Label :: Label "longDescriptiveName")
.
Use with ghc flags @-F -pgmF HListPP@. A file using HListPP
could start with something like
.
> ❴-# OPTIONS_GHC -F -pgmF HListPP #-❵ -- change braces to ascii (haddock doesn't allow literal comments in files)
> ❴-# LANGUAGE DataKinds #-❵
> import Data.HList.CommonMain
> import Control.Lens
.
Then the labels can then be used in expressions with types
like:
.
> `x :: Lens (Record S) (Record T) a b
> `x :: Prism (Variant S) (Variant T) a b
> `a .==. "x" .*.
> `b .==. "y" .*. emptyRecord :: Record [ Tagged "a" String, Tagged "b" String ]
.
where @S@ is a type-level list containing a @Tagged "x" a@
and @T@ is a type-level list containing a @Tagged "x" b@.
.
Note that @`labels@ is expanded to something that
takes up about 26 more columns. To avoid issues with
layout, put a newline after keywords that introduce
layout, at least if there are @`labels@ in the same row.
In other words:
.
> `character.`position.`x %= \ x -> let
> msg = "a really long message about x>0"
> pos = x - 5
> in if pos < 0
> then error msg
> else pos
.
Instead of
.
> `character.`position.`x %= \ x -> let msg = "a really long message about x>0"
> pos = x - 5
> in if pos < 0
> then error msg
> else pos
homepage: http://github.com/aavogt/HListPP
license: BSD3
license-file: LICENSE
author: Adam Vogt <vogt.adam@gmail.com>
maintainer: Adam Vogt <vogt.adam@gmail.com>
category: Development
build-type: Simple
cabal-version: >=1.10
extra-source-files: ChangeLog
source-repository head
type: git
location: http://github.com/aavogt/HListPP
executable HListPP
main-is: HListPP.hs
other-extensions: QuasiQuotes, ViewPatterns
build-depends: base >=4.9 && <5,
regex-applicative >=0.3 && <0.4
default-language: Haskell2010