{-# LANGUAGE TemplateHaskell, TypeFamilies, FlexibleInstances, MultiParamTypeClasses #-}

-- |
-- 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 [ ("pkgName"   , "pkgNameL")
              , ("pkgVersion", "pkgVersionL")
              ] ''PackageIdentifier


instance (t ~ PackageName) => Rewrapped PackageName t
instance Wrapped PackageName where
  type Unwrapped PackageName = String
  _Wrapped' = iso getPackageName PackageName
     where
        getPackageName (PackageName n) = n
  {-# INLINE _Wrapped' #-}


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


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