The lens-family-th package

[ Tags: bsd3, data, library ] [ Propose Tags ]

Due to a cabal/hackage defect, curly braces cannot be adequately displayed here. Please see http://github.com/DanBurton/lens-family-th#readme for a proper description of this package.

(See https://github.com/haskell/cabal/issues/968 for the ticket I created regarding the defect.)


[Skip to Readme]

Properties

Versions 0.1.0.0, 0.2.0.0, 0.2.0.1, 0.3.0.0, 0.4.0.0, 0.4.1.0, 0.5.0.0, 0.5.0.1
Dependencies base (>=4.9 && <4.11), template-haskell (>=2.11 && <2.13) [details]
License BSD3
Copyright (c) Dan Burton 2012-2017
Author Dan Burton
Maintainer danburton.email@gmail.com
Category Data
Home page http://github.com/DanBurton/lens-family-th#readme
Bug tracker http://github.com/DanBurton/lens-family-th/issues
Source repository head: git clone git://github.com/DanBurton/lens-family-th.git
this: git clone git://github.com/DanBurton/lens-family-th.git(tag lens-family-th-0.5.0.1)
Uploaded Sat Aug 5 18:05:08 UTC 2017 by DanBurton
Distributions LTSHaskell:0.5.0.1, NixOS:0.5.0.1, Stackage:0.5.0.1, Tumbleweed:0.5.0.0
Downloads 2646 total (38 in the last 30 days)
Rating (no votes yet) [estimated by rule of succession]
Your Rating
  • λ
  • λ
  • λ
Status Docs available [build log]
Last success reported on 2017-08-05 [all 1 reports]
Hackage Matrix CI

Modules

[Index]

Downloads

Maintainer's Corner

For package maintainers and hackage trustees


Readme for lens-family-th-0.5.0.1

[back to package description]

lens-family-th

build status

Template Haskell to generate lenses for lens-family and lens-family-core.

Usage:

{-# LANGUAGE TemplateHaskell, Rank2Types #-}

import Lens.Family2
import Lens.Family2.TH

data Foo a = Foo { _bar :: Int, _baz :: a }
         deriving (Show, Read, Eq, Ord)
$(makeLenses ''Foo)

This will create lenses bar and baz.

You can instead create these lenses by hand as explained by documentation at Lens.Family.Unchecked.

makeLenses merely generates the following definition for each field, making use of Haskell's record update syntax:

lensName f a = (\x -> a { fieldName = x }) `fmap` f (fieldName a)

makeLenses will refuse to create lenses for data declarations with more than 1 constructor.


For data types with multiple constructors, you can use makeTraversals. For example:

{-# LANGUAGE TemplateHaskell, Rank2Types #-}

import Lens.Family2
import Lens.Family2.TH

data T a c d = A a | B | CD c d Int
$(makeTraversals ''T)

Will create traversals _A, _B, and _C in this fashion:

_A k (A a) = fmap (\a -> A a) (k a)
_A _  B    = pure B
_A _ (C c d i) = pure (C c d i)

_B _ (A a) = pure (A a)
_B k B = fmap (\() -> B) (k ())
_B _ (C c d i) = pure (C c d i)

_C _ (A a) = pure (A a)
_C _ B = pure B
_C k (C c d i) = fmap (\(c',d',i') -> C c' d' i') (k (c,d,i))