Ticket #5959: Lens.hs

File Lens.hs, 595 bytes (added by pcapriotti, 2 years ago)

Minimal test case

Line 
1{-# LANGUAGE TemplateHaskell #-}
2
3module Lens where
4
5import Language.Haskell.TH.Syntax
6import Control.Monad
7
8data Lens a b = Lens a b
9
10makeLens :: Name -> Q [Dec]
11makeLens t@(Name _ f) = do
12    TyConI (DataD _ _ params cons _) <- reify t
13    let [ForallC _ _ (RecC _ [(_, _, ty)])] = cons
14    let params' = map (\x -> case x of (PlainTV n) -> n; (KindedTV n _) -> n) params
15    let appliedT = foldl AppT (ConT t) (map VarT params')
16    return [ SigD (Name (mkOccName "auth") f) (AppT (AppT (ConT ''Lens) appliedT) ty) ]
17
18{- Main.hs:
19
20data App = forall b . App { _auth :: b }
21
22makeLens ''App
23
24-}