th-lego 0.2.0.1 → 0.2.1
raw patch · 2 files changed
+51/−1 lines, 2 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ THLego.Lambdas: vlLens :: Name -> Int -> Int -> Exp
Files
- library/THLego/Lambdas.hs +50/−0
- th-lego.cabal +1/−1
library/THLego/Lambdas.hs view
@@ -8,6 +8,56 @@ {-|+Van Larrhoven lens.+-}+vlLens ::+ {-| Constructor name. -}+ Name ->+ {-| Total amount of members. -}+ Int ->+ {-| Index of the member. -}+ Int ->+ {-|+ Lambda expression of the following type:+ + > forall f. Functor f => (a -> f b) -> s -> f t+ -}+ Exp+vlLens conName numMembers index =+ LamE [onMemberP, productP] exp+ where+ -- Reference implementation:+ -- \ memberMapper (Product a b) -> fmap (\ newMember -> Product newMember b) (memberMapper a)+ onMemberName =+ mkName "memberMapper"+ memberNames =+ fmap alphabeticIndexName (enumFromTo 0 (pred numMembers))+ onMemberP =+ VarP onMemberName+ productP =+ ConP conName pats+ where+ pats =+ fmap VarP memberNames+ exp =+ multiAppE (VarE 'fmap) [setterE, onMemberE]+ where+ setterE =+ LamE [VarP valueName] exp+ where+ valueName =+ mkName "newMember"+ exp =+ multiAppE (ConE conName) (fmap VarE argNames)+ where+ argNames =+ take index memberNames <>+ [valueName] <>+ drop (succ index) memberNames+ onMemberE =+ AppE (VarE onMemberName) (VarE (alphabeticIndexName index))++{-| Simulates lambda-case without the need for extension. -} matcher :: [Match] -> Exp
th-lego.cabal view
@@ -1,5 +1,5 @@ name: th-lego-version: 0.2.0.1+version: 0.2.1 synopsis: Template Haskell construction utilities description: A collection of templates for the typical patterns appearing