A simple single-module library for creating lens field typeclasses in a way that allows them to be shared between modules.
By default, lens' makeFields
creates a new class if it can't find a matching one in scope. This means that if you try to makeFields
records in different modules without importing one module into the other, you'll get conflicting class definitions rather than a single lens which functions with both records.
module A where
data A = A { _aThing :: Bool }
deriving (Show, Read, Eq)
makeFields ''A
module B where
data B = B { _bThing :: String }
deriving (Show, Read, Eq)
makeFields ''B
module Main where
import A
import B
import Control.Lens
main = print $ A False ^. thing -- fails because there are two HasThing classes
If you use shared-fields
, though:
module SharedFields where
generateField "Thing"
-- alternatively:
-- generateFields ["Thing"]
module A where
import SharedFields
data A = A { _aThing :: Bool }
deriving (Show, Read, Eq)
makeFields ''A
module B where
import SharedFields
data B = B { _bThing :: String }
deriving (Show, Read, Eq)
makeFields ''B
module Main where
import A
import B
import Control.Lens
main = print $ A False ^. thing -- works now because there's one consistent HasThing class!