48 lines
1.2 KiB
Haskell
48 lines
1.2 KiB
Haskell
module Utils.Lens.TH where
|
|
|
|
import Control.Lens
|
|
import Control.Lens.Internal.FieldTH
|
|
import Language.Haskell.TH
|
|
|
|
-- import Control.Lens.Misc
|
|
{- NOTE: The code for lensRules_ and makeLenses_ was stolen from package lens-misc-0.0.2.0,
|
|
which was currently unavailable in our stack snapshot.
|
|
See https://github.com/louispan/lens-misc
|
|
-}
|
|
|
|
-- | A 'LensRules' used by 'makeLenses_'.
|
|
lensRules_ :: LensRules
|
|
lensRules_ = lensRules
|
|
& lensField .~ \_ _ n -> [TopName (mkName ('_':nameBase n))]
|
|
|
|
-- | Build lenses (and traversals) with a sensible default configuration.
|
|
-- Works the same as 'makeLenses' except that
|
|
-- the resulting lens is also prefixed with an underscore.
|
|
--
|
|
-- /e.g./
|
|
--
|
|
-- @
|
|
-- data FooBar
|
|
-- = Foo { x, y :: 'Int' }
|
|
-- | Bar { x :: 'Int' }
|
|
-- 'makeLenses' ''FooBar
|
|
-- @
|
|
--
|
|
-- will create
|
|
--
|
|
-- @
|
|
-- _x :: 'Lens'' FooBar 'Int'
|
|
-- _x f (Foo a b) = (\\a\' -> Foo a\' b) \<$\> f a
|
|
-- _x f (Bar a) = Bar \<$\> f a
|
|
-- _y :: 'Traversal'' FooBar 'Int'
|
|
-- _y f (Foo a b) = (\\b\' -> Foo a b\') \<$\> f b
|
|
-- _y _ c\@(Bar _) = pure c
|
|
-- @
|
|
--
|
|
-- @
|
|
-- 'makeLenses_' = 'makeLensesWith' 'lensRules_'
|
|
-- @
|
|
|
|
makeLenses_ :: Name -> DecsQ
|
|
makeLenses_ = makeFieldOptics lensRules_
|