{-# LANGUAGE TemplateHaskell #-}

-- |
-- Lenses for several data types of the 'Distribution.Package' module.
-- All lenses are named after their field names with a 'L' appended.

module CabalLenses.Package where

import Distribution.Package (PackageName(..) , PackageIdentifier(..) , Dependency(..))
import Distribution.Version (VersionRange)
import Control.Lens (makeLensesFor, Lens', lens)


pkgNameString :: Lens' PackageName String
pkgNameString = lens getString setString
   where
      getString (PackageName str) = str
      setString _                 = PackageName


makeLensesFor [ ("pkgName"   , "pkgNameL")
              , ("pkgVersion", "pkgVersionL")
              ] ''PackageIdentifier


depPackageName :: Lens' Dependency PackageName
depPackageName = lens getPkgName setPkgName
   where
      getPkgName (Dependency pkgName _)          = pkgName
      setPkgName (Dependency _ range) newPkgName = Dependency newPkgName range


depVersionRange :: Lens' Dependency VersionRange
depVersionRange = lens getRange setRange
   where
      getRange (Dependency _ range)   = range
      setRange (Dependency pkgName _) = Dependency pkgName