{-# LANGUAGE DataKinds #-} {-# LANGUAGE DuplicateRecordFields #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE OverloadedLabels #-} {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE TypeOperators #-} {-# LANGUAGE UndecidableInstances #-} -- | Test that 'declareFieldLabels' and 'declareLenses' work in the presence of -- @DuplicateRecordFields@ (see issue #323), including when the data constructor -- or field name contain a colon, and with data families (because data families -- are weird). module Optics.TH.Tests.DuplicateRecordFields where import Optics.Core import Optics.TH $(declareFieldLabels [d|data T = Z | MkT { foo :: Int, (<:) :: Int -> Int }|]) $(declareLenses [d|data U = MkU { foo :: Int, (<:) :: Int -> Int }|]) $(declareLenses [d|data (:::) = (:::) { (>:) :: Int -> Int }|]) foo' :: T -> [Int] foo' = toListOf #foo foo'' :: U -> Int foo'' = view foo (<::) :: U -> Int -> Int (<::) = view (<:) (>::) :: (:::) -> Int -> Int (>::) = view (>:) $(declareFieldLabels [d|data family F x data instance F Int = MkF { foo :: Int }|]) $(declareLenses [d|data family G x data instance G Int = MkG { bar :: Int }|]) foo''' :: F Int -> Int foo''' = view #foo bar' :: G Int -> Int bar' = view bar