product-profunctors 0.7.0.2 → 0.7.1.0
raw patch · 10 files changed
+269/−802 lines, 10 filesdep +taggeddep +transformersdep ~base
Dependencies added: tagged, transformers
Dependency ranges changed: base
Files
- Data/Profunctor/Product.hs +10/−376
- Data/Profunctor/Product/Class.hs +12/−0
- Data/Profunctor/Product/Default.hs +22/−255
- Data/Profunctor/Product/Default/Class.hs +6/−0
- Data/Profunctor/Product/Flatten.hs +4/−120
- Data/Profunctor/Product/Internal/TH.hs +32/−6
- Data/Profunctor/Product/TH.hs +7/−7
- Data/Profunctor/Product/Tuples.hs +4/−37
- Data/Profunctor/Product/Tuples/TH.hs +164/−0
- product-profunctors.cabal +8/−1
Data/Profunctor/Product.hs view
@@ -1,20 +1,23 @@-module Data.Profunctor.Product (module Data.Profunctor.Product.Newtype,+{-# LANGUAGE TemplateHaskell #-}+module Data.Profunctor.Product (module Data.Profunctor.Product.Class,+ module Data.Profunctor.Product.Newtype, module Data.Profunctor.Product) where import Prelude hiding (id) import Data.Profunctor (Profunctor, dimap, lmap, WrappedArrow) import qualified Data.Profunctor as Profunctor import Data.Functor.Contravariant (Contravariant, contramap)--- vv TODO: don't want to have to import all those explicitly. What to do?-import Data.Profunctor.Product.Flatten--- vv and these-import Data.Profunctor.Product.Tuples import Control.Category (id) import Control.Arrow (Arrow, (***), (<<<), arr, (&&&)) import Control.Applicative (Applicative, liftA2, pure) import Data.Monoid (Monoid, mempty, (<>)) import Data.Profunctor.Product.Newtype +import Data.Profunctor.Product.Class+import Data.Profunctor.Product.Flatten+import Data.Profunctor.Product.Tuples+import Data.Profunctor.Product.Tuples.TH (pTns, maxTupleSize, pNs)+ -- ProductProfunctor and ProductContravariant are potentially -- redundant type classes. It seems to me that these are equivalent -- to Profunctor with Applicative, and Contravariant with Monoid@@ -60,14 +63,6 @@ -- Still, at least we now have default implementations of the class -- methods, which makes things simpler. --- | A 'ProductProfunctor' is a generalization of an 'Applicative'.--- It has an "input", contravariant type parameter on the left as well--- as the usual 'Applicative' "output", covariant parameter on teh--- right.-class Profunctor p => ProductProfunctor p where- empty :: p () ()- (***!) :: p a b -> p a' b' -> p (a, a') (b, b')- -- This appears to be just 'Data.Functor.Contravariant.Divisible' class Contravariant f => ProductContravariant f where point :: f ()@@ -150,367 +145,6 @@ -- } -pT0 :: ProductProfunctor p => T0 -> p T0 T0-pT0 = const empty--pT1 :: ProductProfunctor p => T1 (p a1 b1) -> p (T1 a1) (T1 b1)-pT1 = id--pT2 :: ProductProfunctor p => T2 (p a1 b1) (p a2 b2) -> p (T2 a1 a2) (T2 b1 b2)-pT2 = uncurry (***!)--chain :: ProductProfunctor p => (t -> p a2 b2) -> (p a1 b1, t)- -> p (a1, a2) (b1, b2)-chain rest (a, as) = pT2 (a, rest as)--pT3 :: ProductProfunctor p => T3 (p a1 b1) (p a2 b2) (p a3 b3)- -> p (T3 a1 a2 a3) (T3 b1 b2 b3)-pT3 = chain pT2--pT4 :: ProductProfunctor p => T4 (p a1 b1) (p a2 b2) (p a3 b3) (p a4 b4)- -> p (T4 a1 a2 a3 a4) (T4 b1 b2 b3 b4)-pT4 = chain pT3--pT5 :: ProductProfunctor p => T5 (p a1 b1) (p a2 b2) (p a3 b3) (p a4 b4)- (p a5 b5)- -> p (T5 a1 a2 a3 a4 a5) (T5 b1 b2 b3 b4 b5)-pT5 = chain pT4--pT6 :: ProductProfunctor p => T6 (p a1 b1) (p a2 b2) (p a3 b3) (p a4 b4)- (p a5 b5) (p a6 b6)- -> p (T6 a1 a2 a3 a4 a5 a6) (T6 b1 b2 b3 b4 b5 b6)-pT6 = chain pT5--pT7 :: ProductProfunctor p => T7 (p a1 b1) (p a2 b2) (p a3 b3) (p a4 b4)- (p a5 b5) (p a6 b6) (p a7 b7)- -> p (T7 a1 a2 a3 a4 a5 a6 a7) (T7 b1 b2 b3 b4 b5 b6 b7)-pT7 = chain pT6--pT8 :: ProductProfunctor p => T8 (p a1 b1) (p a2 b2) (p a3 b3) (p a4 b4)- (p a5 b5) (p a6 b6) (p a7 b7) (p a8 b8)- -> p (T8 a1 a2 a3 a4 a5 a6 a7 a8) (T8 b1 b2 b3 b4 b5 b6 b7 b8)-pT8 = chain pT7--pT9 :: ProductProfunctor p => T9 (p a1 b1) (p a2 b2) (p a3 b3) (p a4 b4)- (p a5 b5) (p a6 b6) (p a7 b7) (p a8 b8)- (p a9 b9)- -> p (T9 a1 a2 a3 a4 a5 a6 a7 a8 a9)- (T9 b1 b2 b3 b4 b5 b6 b7 b8 b9)-pT9 = chain pT8--pT10 :: ProductProfunctor p => T10 (p a1 b1) (p a2 b2) (p a3 b3) (p a4 b4)- (p a5 b5) (p a6 b6) (p a7 b7) (p a8 b8)- (p a9 b9) (p a10 b10)- -> p (T10 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10)- (T10 b1 b2 b3 b4 b5 b6 b7 b8 b9 b10)-pT10 = chain pT9--pT11 :: ProductProfunctor p => T11 (p a1 b1) (p a2 b2) (p a3 b3) (p a4 b4)- (p a5 b5) (p a6 b6) (p a7 b7) (p a8 b8)- (p a9 b9) (p a10 b10) (p a11 b11)- -> p (T11 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11)- (T11 b1 b2 b3 b4 b5 b6 b7 b8 b9 b10 b11)-pT11 = chain pT10--pT12 :: ProductProfunctor p => T12 (p a1 b1) (p a2 b2) (p a3 b3) (p a4 b4)- (p a5 b5) (p a6 b6) (p a7 b7) (p a8 b8)- (p a9 b9) (p a10 b10) (p a11 b11)- (p a12 b12)- -> p (T12 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12)- (T12 b1 b2 b3 b4 b5 b6 b7 b8 b9 b10 b11 b12)-pT12 = chain pT11--pT13 :: ProductProfunctor p => T13 (p a1 b1) (p a2 b2) (p a3 b3) (p a4 b4)- (p a5 b5) (p a6 b6) (p a7 b7) (p a8 b8)- (p a9 b9) (p a10 b10) (p a11 b11)- (p a12 b12) (p a13 b13)- -> p (T13 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13)- (T13 b1 b2 b3 b4 b5 b6 b7 b8 b9 b10 b11 b12 b13)-pT13 = chain pT12--pT14 :: ProductProfunctor p => T14 (p a1 b1) (p a2 b2) (p a3 b3) (p a4 b4)- (p a5 b5) (p a6 b6) (p a7 b7) (p a8 b8)- (p a9 b9) (p a10 b10) (p a11 b11)- (p a12 b12) (p a13 b13) (p a14 b14)- -> p (T14 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14)- (T14 b1 b2 b3 b4 b5 b6 b7 b8 b9 b10 b11 b12 b13 b14)-pT14 = chain pT13--pT15 :: ProductProfunctor p => T15 (p a1 b1) (p a2 b2) (p a3 b3) (p a4 b4)- (p a5 b5) (p a6 b6) (p a7 b7) (p a8 b8)- (p a9 b9) (p a10 b10) (p a11 b11)- (p a12 b12) (p a13 b13) (p a14 b14)- (p a15 b15)- -> p (T15 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15)- (T15 b1 b2 b3 b4 b5 b6 b7 b8 b9 b10 b11 b12 b13 b14 b15)-pT15 = chain pT14--pT16 :: ProductProfunctor p => T16 (p a1 b1) (p a2 b2) (p a3 b3) (p a4 b4)- (p a5 b5) (p a6 b6) (p a7 b7) (p a8 b8)- (p a9 b9) (p a10 b10) (p a11 b11)- (p a12 b12) (p a13 b13) (p a14 b14)- (p a15 b15) (p a16 b16)- -> p (T16 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16)- (T16 b1 b2 b3 b4 b5 b6 b7 b8 b9 b10 b11 b12 b13 b14 b15 b16)-pT16 = chain pT15--pT17 :: ProductProfunctor p => T17 (p a1 b1) (p a2 b2) (p a3 b3) (p a4 b4)- (p a5 b5) (p a6 b6) (p a7 b7) (p a8 b8)- (p a9 b9) (p a10 b10) (p a11 b11)- (p a12 b12) (p a13 b13) (p a14 b14)- (p a15 b15) (p a16 b16) (p a17 b17)- -> p (T17 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17)- (T17 b1 b2 b3 b4 b5 b6 b7 b8 b9 b10 b11 b12 b13 b14 b15 b16 b17)-pT17 = chain pT16--pT18 :: ProductProfunctor p => T18 (p a1 b1) (p a2 b2) (p a3 b3) (p a4 b4)- (p a5 b5) (p a6 b6) (p a7 b7) (p a8 b8)- (p a9 b9) (p a10 b10) (p a11 b11)- (p a12 b12) (p a13 b13) (p a14 b14)- (p a15 b15) (p a16 b16) (p a17 b17)- (p a18 b18)- -> p (T18 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18)- (T18 b1 b2 b3 b4 b5 b6 b7 b8 b9 b10 b11 b12 b13 b14 b15 b16 b17 b18)-pT18 = chain pT17--pT19 :: ProductProfunctor p => T19 (p a1 b1) (p a2 b2) (p a3 b3) (p a4 b4)- (p a5 b5) (p a6 b6) (p a7 b7) (p a8 b8)- (p a9 b9) (p a10 b10) (p a11 b11)- (p a12 b12) (p a13 b13) (p a14 b14)- (p a15 b15) (p a16 b16) (p a17 b17)- (p a18 b18) (p a19 b19)- -> p (T19 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19)- (T19 b1 b2 b3 b4 b5 b6 b7 b8 b9 b10 b11 b12 b13 b14 b15 b16 b17 b18 b19)-pT19 = chain pT18--pT20 :: ProductProfunctor p => T20 (p a1 b1) (p a2 b2) (p a3 b3) (p a4 b4)- (p a5 b5) (p a6 b6) (p a7 b7) (p a8 b8)- (p a9 b9) (p a10 b10) (p a11 b11)- (p a12 b12) (p a13 b13) (p a14 b14)- (p a15 b15) (p a16 b16) (p a17 b17)- (p a18 b18) (p a19 b19) (p a20 b20)- -> p (T20 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20)- (T20 b1 b2 b3 b4 b5 b6 b7 b8 b9 b10 b11 b12 b13 b14 b15 b16 b17 b18 b19 b20)-pT20 = chain pT19--pT21 :: ProductProfunctor p => T21 (p a1 b1) (p a2 b2) (p a3 b3) (p a4 b4)- (p a5 b5) (p a6 b6) (p a7 b7) (p a8 b8)- (p a9 b9) (p a10 b10) (p a11 b11)- (p a12 b12) (p a13 b13) (p a14 b14)- (p a15 b15) (p a16 b16) (p a17 b17)- (p a18 b18) (p a19 b19) (p a20 b20)- (p a21 b21)- -> p (T21 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 a21)- (T21 b1 b2 b3 b4 b5 b6 b7 b8 b9 b10 b11 b12 b13 b14 b15 b16 b17 b18 b19 b20 b21)-pT21 = chain pT20--pT22 :: ProductProfunctor p => T22 (p a1 b1) (p a2 b2) (p a3 b3) (p a4 b4)- (p a5 b5) (p a6 b6) (p a7 b7) (p a8 b8)- (p a9 b9) (p a10 b10) (p a11 b11)- (p a12 b12) (p a13 b13) (p a14 b14)- (p a15 b15) (p a16 b16) (p a17 b17)- (p a18 b18) (p a19 b19) (p a20 b20)- (p a21 b21) (p a22 b22)- -> p (T22 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 a21 a22)- (T22 b1 b2 b3 b4 b5 b6 b7 b8 b9 b10 b11 b12 b13 b14 b15 b16 b17 b18 b19 b20 b21 b22)-pT22 = chain pT21--pT23 :: ProductProfunctor p => T23 (p a1 b1) (p a2 b2) (p a3 b3) (p a4 b4)- (p a5 b5) (p a6 b6) (p a7 b7) (p a8 b8)- (p a9 b9) (p a10 b10) (p a11 b11)- (p a12 b12) (p a13 b13) (p a14 b14)- (p a15 b15) (p a16 b16) (p a17 b17)- (p a18 b18) (p a19 b19) (p a20 b20)- (p a21 b21) (p a22 b22) (p a23 b23)- -> p (T23 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 a21 a22 a23)- (T23 b1 b2 b3 b4 b5 b6 b7 b8 b9 b10 b11 b12 b13 b14 b15 b16 b17 b18 b19 b20 b21 b22 b23)-pT23 = chain pT22--pT24 :: ProductProfunctor p => T24 (p a1 b1) (p a2 b2) (p a3 b3) (p a4 b4)- (p a5 b5) (p a6 b6) (p a7 b7) (p a8 b8)- (p a9 b9) (p a10 b10) (p a11 b11)- (p a12 b12) (p a13 b13) (p a14 b14)- (p a15 b15) (p a16 b16) (p a17 b17)- (p a18 b18) (p a19 b19) (p a20 b20)- (p a21 b21) (p a22 b22) (p a23 b23)- (p a24 b24)- -> p (T24 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 a21 a22 a23 a24)- (T24 b1 b2 b3 b4 b5 b6 b7 b8 b9 b10 b11 b12 b13 b14 b15 b16 b17 b18 b19 b20 b21 b22 b23 b24)-pT24 = chain pT23--convert :: Profunctor p => (a2 -> a1) -> (tp -> tTp) -> (b1 -> b2)- -> (tTp -> p a1 b1)- -> tp -> p a2 b2-convert u u' f c = dimap u f . c . u'--p0 :: ProductProfunctor p => () -> p () ()-p0 = convert unflatten0 unflatten0 flatten0 pT0--p1 :: ProductProfunctor p => p a1 b1 -> p a1 b1-p1 = convert unflatten1 unflatten1 flatten1 pT1--p2 :: ProductProfunctor p => (p a1 b1, p a2 b2) -> p (a1, a2) (b1, b2)-p2 = convert unflatten2 unflatten2 flatten2 pT2--p3 :: ProductProfunctor p => (p a1 b1, p a2 b2, p a3 b3)- -> p (a1, a2, a3) (b1, b2, b3)-p3 = convert unflatten3 unflatten3 flatten3 pT3--p4 :: ProductProfunctor p => (p a1 b1, p a2 b2, p a3 b3, p a4 b4)- -> p (a1, a2, a3, a4) (b1, b2, b3, b4)-p4 = convert unflatten4 unflatten4 flatten4 pT4--p5 :: ProductProfunctor p => (p a1 b1, p a2 b2, p a3 b3, p a4 b4,- p a5 b5)- -> p (a1, a2, a3, a4, a5) (b1, b2, b3, b4, b5)-p5 = convert unflatten5 unflatten5 flatten5 pT5--p6 :: ProductProfunctor p => (p a1 b1, p a2 b2, p a3 b3, p a4 b4,- p a5 b5, p a6 b6)- -> p (a1, a2, a3, a4, a5, a6) (b1, b2, b3, b4, b5, b6)-p6 = convert unflatten6 unflatten6 flatten6 pT6--p7 :: ProductProfunctor p => (p a1 b1, p a2 b2, p a3 b3, p a4 b4,- p a5 b5, p a6 b6, p a7 b7)- -> p (a1, a2, a3, a4, a5, a6, a7) (b1, b2, b3, b4, b5, b6, b7)-p7 = convert unflatten7 unflatten7 flatten7 pT7--p8 :: ProductProfunctor p => (p a1 b1, p a2 b2, p a3 b3, p a4 b4,- p a5 b5, p a6 b6, p a7 b7, p a8 b8)- -> p (a1, a2, a3, a4, a5, a6, a7, a8) (b1, b2, b3, b4, b5, b6, b7, b8)-p8 = convert unflatten8 unflatten8 flatten8 pT8--p9 :: ProductProfunctor p => (p a1 b1, p a2 b2, p a3 b3, p a4 b4,- p a5 b5, p a6 b6, p a7 b7, p a8 b8,- p a9 b9)- -> p (a1, a2, a3, a4, a5, a6, a7, a8, a9)- (b1, b2, b3, b4, b5, b6, b7, b8, b9)-p9 = convert unflatten9 unflatten9 flatten9 pT9--p10 :: ProductProfunctor p => (p a1 b1, p a2 b2, p a3 b3, p a4 b4,- p a5 b5, p a6 b6, p a7 b7, p a8 b8,- p a9 b9, p a10 b10)- -> p (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)- (b1, b2, b3, b4, b5, b6, b7, b8, b9, b10)-p10 = convert unflatten10 unflatten10 flatten10 pT10--p11 :: ProductProfunctor p => (p a1 b1, p a2 b2, p a3 b3, p a4 b4,- p a5 b5, p a6 b6, p a7 b7, p a8 b8,- p a9 b9, p a10 b10, p a11 b11)- -> p (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11)- (b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11)-p11 = convert unflatten11 unflatten11 flatten11 pT11--p12 :: ProductProfunctor p => (p a1 b1, p a2 b2, p a3 b3, p a4 b4,- p a5 b5, p a6 b6, p a7 b7, p a8 b8,- p a9 b9, p a10 b10, p a11 b11, p a12 b12)- -> p (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12)- (b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12)-p12 = convert unflatten12 unflatten12 flatten12 pT12--p13 :: ProductProfunctor p => (p a1 b1, p a2 b2, p a3 b3, p a4 b4,- p a5 b5, p a6 b6, p a7 b7, p a8 b8,- p a9 b9, p a10 b10, p a11 b11, p a12 b12,- p a13 b13)- -> p (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13)- (b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13)-p13 = convert unflatten13 unflatten13 flatten13 pT13--p14 :: ProductProfunctor p => (p a1 b1, p a2 b2, p a3 b3, p a4 b4,- p a5 b5, p a6 b6, p a7 b7, p a8 b8,- p a9 b9, p a10 b10, p a11 b11, p a12 b12,- p a13 b13, p a14 b14)- -> p (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14)- (b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14)-p14 = convert unflatten14 unflatten14 flatten14 pT14--p15 :: ProductProfunctor p => (p a1 b1, p a2 b2, p a3 b3, p a4 b4,- p a5 b5, p a6 b6, p a7 b7, p a8 b8,- p a9 b9, p a10 b10, p a11 b11, p a12 b12,- p a13 b13, p a14 b14, p a15 b15)- -> p (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15)- (b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15)-p15 = convert unflatten15 unflatten15 flatten15 pT15--p16 :: ProductProfunctor p => (p a1 b1, p a2 b2, p a3 b3, p a4 b4,- p a5 b5, p a6 b6, p a7 b7, p a8 b8,- p a9 b9, p a10 b10, p a11 b11, p a12 b12,- p a13 b13, p a14 b14, p a15 b15, p a16 b16)- -> p (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16)- (b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15, b16)-p16 = convert unflatten16 unflatten16 flatten16 pT16--p17 :: ProductProfunctor p => (p a1 b1, p a2 b2, p a3 b3, p a4 b4,- p a5 b5, p a6 b6, p a7 b7, p a8 b8,- p a9 b9, p a10 b10, p a11 b11, p a12 b12,- p a13 b13, p a14 b14, p a15 b15, p a16 b16, p a17 b17)- -> p (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17)- (b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15, b16, b17)-p17 = convert unflatten17 unflatten17 flatten17 pT17--p18 :: ProductProfunctor p => (p a1 b1, p a2 b2, p a3 b3, p a4 b4,- p a5 b5, p a6 b6, p a7 b7, p a8 b8,- p a9 b9, p a10 b10, p a11 b11, p a12 b12,- p a13 b13, p a14 b14, p a15 b15, p a16 b16,- p a17 b17, p a18 b18)- -> p (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18)- (b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15, b16, b17, b18)-p18 = convert unflatten18 unflatten18 flatten18 pT18--p19 :: ProductProfunctor p => (p a1 b1, p a2 b2, p a3 b3, p a4 b4,- p a5 b5, p a6 b6, p a7 b7, p a8 b8,- p a9 b9, p a10 b10, p a11 b11, p a12 b12,- p a13 b13, p a14 b14, p a15 b15, p a16 b16,- p a17 b17, p a18 b18, p a19 b19)- -> p (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19)- (b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15, b16, b17, b18, b19)-p19 = convert unflatten19 unflatten19 flatten19 pT19--p20 :: ProductProfunctor p => (p a1 b1, p a2 b2, p a3 b3, p a4 b4,- p a5 b5, p a6 b6, p a7 b7, p a8 b8,- p a9 b9, p a10 b10, p a11 b11, p a12 b12,- p a13 b13, p a14 b14, p a15 b15, p a16 b16,- p a17 b17, p a18 b18, p a19 b19, p a20 b20)- -> p (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20)- (b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15, b16, b17, b18, b19, b20)-p20 = convert unflatten20 unflatten20 flatten20 pT20--p21 :: ProductProfunctor p => (p a1 b1, p a2 b2, p a3 b3, p a4 b4,- p a5 b5, p a6 b6, p a7 b7, p a8 b8,- p a9 b9, p a10 b10, p a11 b11, p a12 b12,- p a13 b13, p a14 b14, p a15 b15, p a16 b16,- p a17 b17, p a18 b18, p a19 b19, p a20 b20,- p a21 b21)- -> p (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21)- (b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15, b16, b17, b18, b19, b20, b21)-p21 = convert unflatten21 unflatten21 flatten21 pT21--p22 :: ProductProfunctor p => (p a1 b1, p a2 b2, p a3 b3, p a4 b4,- p a5 b5, p a6 b6, p a7 b7, p a8 b8,- p a9 b9, p a10 b10, p a11 b11, p a12 b12,- p a13 b13, p a14 b14, p a15 b15, p a16 b16,- p a17 b17, p a18 b18, p a19 b19, p a20 b20,- p a21 b21, p a22 b22)- -> p (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22)- (b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15, b16, b17, b18, b19, b20, b21, b22)-p22 = convert unflatten22 unflatten22 flatten22 pT22--p23 :: ProductProfunctor p => (p a1 b1, p a2 b2, p a3 b3, p a4 b4,- p a5 b5, p a6 b6, p a7 b7, p a8 b8,- p a9 b9, p a10 b10, p a11 b11, p a12 b12,- p a13 b13, p a14 b14, p a15 b15, p a16 b16,- p a17 b17, p a18 b18, p a19 b19, p a20 b20,- p a21 b21, p a22 b22, p a23 b23)- -> p (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23)- (b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15, b16, b17, b18, b19, b20, b21, b22, b23)-p23 = convert unflatten23 unflatten23 flatten23 pT23+pTns [0..maxTupleSize] -p24 :: ProductProfunctor p => (p a1 b1, p a2 b2, p a3 b3, p a4 b4,- p a5 b5, p a6 b6, p a7 b7, p a8 b8,- p a9 b9, p a10 b10, p a11 b11, p a12 b12,- p a13 b13, p a14 b14, p a15 b15, p a16 b16,- p a17 b17, p a18 b18, p a19 b19, p a20 b20,- p a21 b21, p a22 b22, p a23 b23, p a24 b24)- -> p (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24)- (b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15, b16, b17, b18, b19, b20, b21, b22, b23, b24)-p24 = convert unflatten24 unflatten24 flatten24 pT24+pNs [0..maxTupleSize]
+ Data/Profunctor/Product/Class.hs view
@@ -0,0 +1,12 @@+module Data.Profunctor.Product.Class where++import Data.Profunctor (Profunctor)++-- | A 'ProductProfunctor' is a generalization of an 'Applicative'.+-- It has an "input", contravariant type parameter on the left as well+-- as the usual 'Applicative' "output", covariant parameter on teh+-- right.+class Profunctor p => ProductProfunctor p where+ empty :: p () ()+ (***!) :: p a b -> p a' b' -> p (a, a') (b, b')+
Data/Profunctor/Product/Default.hs view
@@ -1,268 +1,35 @@+{-# OPTIONS_GHC -fno-warn-orphans #-} {-# LANGUAGE MultiParamTypeClasses, FlexibleInstances,- FlexibleContexts #-}+ FlexibleContexts, PolyKinds, TemplateHaskell #-} -module Data.Profunctor.Product.Default where+module Data.Profunctor.Product.Default+ ( module Data.Profunctor.Product.Default+ , module Data.Profunctor.Product.Default.Class+ ) where +import Control.Applicative (Const (Const))+import Data.Functor.Identity (Identity (Identity))+import Data.Profunctor (Profunctor, dimap) -- TODO: vv this imports a lot of names. Should we list them all? import Data.Profunctor.Product+import Data.Tagged (Tagged (Tagged)) -class Default p a b where- -- Would rather call it "default", but that's a keyword- def :: p a b+import Data.Profunctor.Product.Default.Class+import Data.Profunctor.Product.Tuples.TH (mkDefaultNs, maxTupleSize) cdef :: Default (PPOfContravariant u) a a => u a cdef = unPPOfContravariant def -instance ProductProfunctor p => Default p () () where- def = empty--instance (ProductProfunctor p, Default p a1 b1, Default p a2 b2)- => Default p (a1, a2) (b1, b2) where- def = p2 (def, def)--instance (ProductProfunctor p, Default p a1 b1, Default p a2 b2,- Default p a3 b3)- => Default p (a1, a2, a3)- (b1, b2, b3) where- def = p3 (def, def, def)--instance (ProductProfunctor p, Default p a1 b1, Default p a2 b2,- Default p a3 b3, Default p a4 b4)- => Default p (a1, a2, a3, a4)- (b1, b2, b3, b4) where- def = p4 (def, def, def, def)--instance (ProductProfunctor p, Default p a1 b1, Default p a2 b2,- Default p a3 b3, Default p a4 b4, Default p a5 b5)- => Default p (a1, a2, a3, a4, a5)- (b1, b2, b3, b4, b5) where- def = p5 (def, def, def, def, def)--instance (ProductProfunctor p, Default p a1 b1, Default p a2 b2,- Default p a3 b3, Default p a4 b4, Default p a5 b5,- Default p a6 b6)- => Default p (a1, a2, a3, a4, a5, a6)- (b1, b2, b3, b4, b5, b6) where- def = p6 (def, def, def, def, def, def)--instance (ProductProfunctor p, Default p a1 b1, Default p a2 b2,- Default p a3 b3, Default p a4 b4, Default p a5 b5,- Default p a6 b6, Default p a7 b7)- => Default p (a1, a2, a3, a4, a5, a6, a7)- (b1, b2, b3, b4, b5, b6, b7) where- def = p7 (def, def, def, def, def, def, def)--instance (ProductProfunctor p, Default p a1 b1, Default p a2 b2,- Default p a3 b3, Default p a4 b4, Default p a5 b5,- Default p a6 b6, Default p a7 b7, Default p a8 b8)- => Default p (a1, a2, a3, a4, a5, a6, a7, a8)- (b1, b2, b3, b4, b5, b6, b7, b8) where- def = p8 (def, def, def, def, def, def, def, def)--instance (ProductProfunctor p, Default p a1 b1, Default p a2 b2,- Default p a3 b3, Default p a4 b4, Default p a5 b5,- Default p a6 b6, Default p a7 b7, Default p a8 b8,- Default p a9 b9)- => Default p (a1, a2, a3, a4, a5, a6, a7, a8, a9)- (b1, b2, b3, b4, b5, b6, b7, b8, b9) where- def = p9 (def, def, def, def, def, def, def, def, def)--instance (ProductProfunctor p, Default p a1 b1, Default p a2 b2,- Default p a3 b3, Default p a4 b4, Default p a5 b5,- Default p a6 b6, Default p a7 b7, Default p a8 b8,- Default p a9 b9, Default p a10 b10)- => Default p (a1, a2, a3, a4, a5, a6, a7, a8,- a9, a10)- (b1, b2, b3, b4, b5, b6, b7, b8,- b9, b10) where- def = p10 (def, def, def, def, def, def, def, def, def, def)--instance (ProductProfunctor p, Default p a1 b1, Default p a2 b2,- Default p a3 b3, Default p a4 b4, Default p a5 b5,- Default p a6 b6, Default p a7 b7, Default p a8 b8,- Default p a9 b9, Default p a10 b10, Default p a11 b11)- => Default p (a1, a2, a3, a4, a5, a6, a7, a8,- a9, a10, a11)- (b1, b2, b3, b4, b5, b6, b7, b8,- b9, b10, b11) where- def = p11 (def, def, def, def, def, def, def, def, def, def, def)--instance (ProductProfunctor p, Default p a1 b1, Default p a2 b2,- Default p a3 b3, Default p a4 b4, Default p a5 b5,- Default p a6 b6, Default p a7 b7, Default p a8 b8,- Default p a9 b9, Default p a10 b10, Default p a11 b11,- Default p a12 b12)- => Default p (a1, a2, a3, a4, a5, a6, a7, a8,- a9, a10, a11, a12)- (b1, b2, b3, b4, b5, b6, b7, b8,- b9, b10, b11, b12) where- def = p12 (def, def, def, def, def, def, def, def, def, def, def, def)--instance (ProductProfunctor p, Default p a1 b1, Default p a2 b2,- Default p a3 b3, Default p a4 b4, Default p a5 b5,- Default p a6 b6, Default p a7 b7, Default p a8 b8,- Default p a9 b9, Default p a10 b10, Default p a11 b11,- Default p a12 b12, Default p a13 b13)- => Default p (a1, a2, a3, a4, a5, a6, a7, a8,- a9, a10, a11, a12, a13)- (b1, b2, b3, b4, b5, b6, b7, b8,- b9, b10, b11, b12, b13) where- def = p13 (def, def, def, def, def, def, def, def, def, def,- def, def, def)--instance (ProductProfunctor p, Default p a1 b1, Default p a2 b2,- Default p a3 b3, Default p a4 b4, Default p a5 b5,- Default p a6 b6, Default p a7 b7, Default p a8 b8,- Default p a9 b9, Default p a10 b10, Default p a11 b11,- Default p a12 b12, Default p a13 b13, Default p a14 b14)- => Default p (a1, a2, a3, a4, a5, a6, a7, a8,- a9, a10, a11, a12, a13, a14)- (b1, b2, b3, b4, b5, b6, b7, b8,- b9, b10, b11, b12, b13, b14) where- def = p14 (def, def, def, def, def, def, def, def, def, def,- def, def, def, def)--instance (ProductProfunctor p, Default p a1 b1, Default p a2 b2,- Default p a3 b3, Default p a4 b4, Default p a5 b5,- Default p a6 b6, Default p a7 b7, Default p a8 b8,- Default p a9 b9, Default p a10 b10, Default p a11 b11,- Default p a12 b12, Default p a13 b13, Default p a14 b14, Default p a15 b15)- => Default p (a1, a2, a3, a4, a5, a6, a7, a8,- a9, a10, a11, a12, a13, a14, a15)- (b1, b2, b3, b4, b5, b6, b7, b8,- b9, b10, b11, b12, b13, b14, b15) where- def = p15 (def, def, def, def, def, def, def, def, def, def,- def, def, def, def, def)--instance (ProductProfunctor p, Default p a1 b1, Default p a2 b2,- Default p a3 b3, Default p a4 b4, Default p a5 b5,- Default p a6 b6, Default p a7 b7, Default p a8 b8,- Default p a9 b9, Default p a10 b10, Default p a11 b11,- Default p a12 b12, Default p a13 b13, Default p a14 b14,- Default p a15 b15, Default p a16 b16)- => Default p (a1, a2, a3, a4, a5, a6, a7, a8,- a9, a10, a11, a12, a13, a14, a15, a16)- (b1, b2, b3, b4, b5, b6, b7, b8,- b9, b10, b11, b12, b13, b14, b15, b16) where- def = p16 (def, def, def, def, def, def, def, def, def, def,- def, def, def, def, def, def)--instance (ProductProfunctor p, Default p a1 b1, Default p a2 b2,- Default p a3 b3, Default p a4 b4, Default p a5 b5,- Default p a6 b6, Default p a7 b7, Default p a8 b8,- Default p a9 b9, Default p a10 b10, Default p a11 b11,- Default p a12 b12, Default p a13 b13, Default p a14 b14,- Default p a15 b15, Default p a16 b16, Default p a17 b17)- => Default p (a1, a2, a3, a4, a5, a6, a7, a8,- a9, a10, a11, a12, a13, a14, a15, a16, a17)- (b1, b2, b3, b4, b5, b6, b7, b8,- b9, b10, b11, b12, b13, b14, b15, b16, b17) where- def = p17 (def, def, def, def, def, def, def, def, def, def,- def, def, def, def, def, def, def)--instance (ProductProfunctor p, Default p a1 b1, Default p a2 b2,- Default p a3 b3, Default p a4 b4, Default p a5 b5,- Default p a6 b6, Default p a7 b7, Default p a8 b8,- Default p a9 b9, Default p a10 b10, Default p a11 b11,- Default p a12 b12, Default p a13 b13, Default p a14 b14,- Default p a15 b15, Default p a16 b16, Default p a17 b17,- Default p a18 b18)- => Default p (a1, a2, a3, a4, a5, a6, a7, a8,- a9, a10, a11, a12, a13, a14, a15, a16, a17, a18)- (b1, b2, b3, b4, b5, b6, b7, b8,- b9, b10, b11, b12, b13, b14, b15, b16, b17, b18) where- def = p18 (def, def, def, def, def, def, def, def, def, def,- def, def, def, def, def, def, def, def)--instance (ProductProfunctor p, Default p a1 b1, Default p a2 b2,- Default p a3 b3, Default p a4 b4, Default p a5 b5,- Default p a6 b6, Default p a7 b7, Default p a8 b8,- Default p a9 b9, Default p a10 b10, Default p a11 b11,- Default p a12 b12, Default p a13 b13, Default p a14 b14,- Default p a15 b15, Default p a16 b16, Default p a17 b17,- Default p a18 b18, Default p a19 b19)- => Default p (a1, a2, a3, a4, a5, a6, a7, a8,- a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19)- (b1, b2, b3, b4, b5, b6, b7, b8,- b9, b10, b11, b12, b13, b14, b15, b16, b17, b18, b19) where- def = p19 (def, def, def, def, def, def, def, def, def, def,- def, def, def, def, def, def, def, def, def)--instance (ProductProfunctor p, Default p a1 b1, Default p a2 b2,- Default p a3 b3, Default p a4 b4, Default p a5 b5,- Default p a6 b6, Default p a7 b7, Default p a8 b8,- Default p a9 b9, Default p a10 b10, Default p a11 b11,- Default p a12 b12, Default p a13 b13, Default p a14 b14,- Default p a15 b15, Default p a16 b16, Default p a17 b17,- Default p a18 b18, Default p a19 b19, Default p a20 b20)- => Default p (a1, a2, a3, a4, a5, a6, a7, a8,- a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20)- (b1, b2, b3, b4, b5, b6, b7, b8,- b9, b10, b11, b12, b13, b14, b15, b16, b17, b18, b19, b20) where- def = p20 (def, def, def, def, def, def, def, def, def, def,- def, def, def, def, def, def, def, def, def, def)--instance (ProductProfunctor p, Default p a1 b1, Default p a2 b2,- Default p a3 b3, Default p a4 b4, Default p a5 b5,- Default p a6 b6, Default p a7 b7, Default p a8 b8,- Default p a9 b9, Default p a10 b10, Default p a11 b11,- Default p a12 b12, Default p a13 b13, Default p a14 b14,- Default p a15 b15, Default p a16 b16, Default p a17 b17,- Default p a18 b18, Default p a19 b19, Default p a20 b20,- Default p a21 b21)- => Default p (a1, a2, a3, a4, a5, a6, a7, a8,- a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21)- (b1, b2, b3, b4, b5, b6, b7, b8,- b9, b10, b11, b12, b13, b14, b15, b16, b17, b18, b19, b20, b21) where- def = p21 (def, def, def, def, def, def, def, def, def, def,- def, def, def, def, def, def, def, def, def, def,- def)+instance (Profunctor p, Default p a b) => Default p (Identity a) (Identity b)+ where+ def = dimap (\(Identity a) -> a) Identity def -instance (ProductProfunctor p, Default p a1 b1, Default p a2 b2,- Default p a3 b3, Default p a4 b4, Default p a5 b5,- Default p a6 b6, Default p a7 b7, Default p a8 b8,- Default p a9 b9, Default p a10 b10, Default p a11 b11,- Default p a12 b12, Default p a13 b13, Default p a14 b14,- Default p a15 b15, Default p a16 b16, Default p a17 b17,- Default p a18 b18, Default p a19 b19, Default p a20 b20,- Default p a21 b21, Default p a22 b22)- => Default p (a1, a2, a3, a4, a5, a6, a7, a8,- a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22)- (b1, b2, b3, b4, b5, b6, b7, b8,- b9, b10, b11, b12, b13, b14, b15, b16, b17, b18, b19, b20, b21, b22) where- def = p22 (def, def, def, def, def, def, def, def, def, def,- def, def, def, def, def, def, def, def, def, def,- def, def)+instance (Profunctor p, Default p a b) => Default p (Const a c) (Const b c')+ where+ def = dimap (\(Const a) -> a) Const def -instance (ProductProfunctor p, Default p a1 b1, Default p a2 b2,- Default p a3 b3, Default p a4 b4, Default p a5 b5,- Default p a6 b6, Default p a7 b7, Default p a8 b8,- Default p a9 b9, Default p a10 b10, Default p a11 b11,- Default p a12 b12, Default p a13 b13, Default p a14 b14,- Default p a15 b15, Default p a16 b16, Default p a17 b17,- Default p a18 b18, Default p a19 b19, Default p a20 b20,- Default p a21 b21, Default p a22 b22, Default p a23 b23)- => Default p (a1, a2, a3, a4, a5, a6, a7, a8,- a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23)- (b1, b2, b3, b4, b5, b6, b7, b8,- b9, b10, b11, b12, b13, b14, b15, b16, b17, b18, b19, b20, b21, b22, b23) where- def = p23 (def, def, def, def, def, def, def, def, def, def,- def, def, def, def, def, def, def, def, def, def,- def, def, def)+instance (Profunctor p, Default p a b) => Default p (Tagged s a) (Tagged s' b)+ where+ def = dimap (\(Tagged a) -> a) Tagged def -instance (ProductProfunctor p, Default p a1 b1, Default p a2 b2,- Default p a3 b3, Default p a4 b4, Default p a5 b5,- Default p a6 b6, Default p a7 b7, Default p a8 b8,- Default p a9 b9, Default p a10 b10, Default p a11 b11,- Default p a12 b12, Default p a13 b13, Default p a14 b14,- Default p a15 b15, Default p a16 b16, Default p a17 b17,- Default p a18 b18, Default p a19 b19, Default p a20 b20,- Default p a21 b21, Default p a22 b22, Default p a23 b23,- Default p a24 b24)- => Default p (a1, a2, a3, a4, a5, a6, a7, a8,- a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24)- (b1, b2, b3, b4, b5, b6, b7, b8,- b9, b10, b11, b12, b13, b14, b15, b16, b17, b18, b19, b20, b21, b22, b23, b24) where- def = p24 (def, def, def, def, def, def, def, def, def, def,- def, def, def, def, def, def, def, def, def, def,- def, def, def, def)+mkDefaultNs (0:[2..maxTupleSize])
+ Data/Profunctor/Product/Default/Class.hs view
@@ -0,0 +1,6 @@+{-# LANGUAGE MultiParamTypeClasses #-}+module Data.Profunctor.Product.Default.Class where++class Default p a b where+ -- Would rather call it "default", but that's a keyword+ def :: p a b
Data/Profunctor/Product/Flatten.hs view
@@ -1,124 +1,8 @@-{-# OPTIONS_GHC -fno-warn-missing-signatures #-}+{-# LANGUAGE TemplateHaskell #-} module Data.Profunctor.Product.Flatten where -flatten0 () = ()-unflatten0 () = ()--flatten1 a = a-unflatten1 a = a--flatten2 (a, b) = (a, b)-unflatten2 (a, b) = (a, b)--flatten3 (a, (b, c)) = (a, b, c)-unflatten3 (a, b, c) = (a, (b, c))--flatten4 (a, (b, (c, a4))) = (a, b, c, a4)-unflatten4 (a, b, c, a4) = (a, (b, (c, a4)))--flatten5 (a, (b, (c, (a4, a5)))) = (a, b, c, a4, a5)-unflatten5 (a, b, c, a4, a5) = (a, (b, (c, (a4, a5))))--flatten6 (a, (b, (c, (a4, (a5, a6))))) = (a, b, c, a4, a5, a6)-unflatten6 (a, b, c, a4, a5, a6) = (a, (b, (c, (a4, (a5, a6)))))--flatten7 (a, (b, (c, (a4, (a5, (a6, a7)))))) = (a, b, c, a4, a5, a6, a7)-unflatten7 (a, b, c, a4, a5, a6, a7) = (a, (b, (c, (a4, (a5, (a6, a7))))))--flatten8 (a, (b, (c, (a4, (a5, (a6, (a7, a8)))))))- = (a, b, c, a4, a5, a6, a7, a8)-unflatten8 (a, b, c, a4, a5, a6, a7, a8)- = (a, (b, (c, (a4, (a5, (a6, (a7, a8)))))))--flatten9 (a, (b, (c, (a4, (a5, (a6, (a7, (a8, a9))))))))- = (a, b, c, a4, a5, a6, a7, a8, a9)-unflatten9 (a, b, c, a4, a5, a6, a7, a8, a9)- = (a, (b, (c, (a4, (a5, (a6, (a7, (a8, a9))))))))--flatten10 (a, (b, (c, (a4, (a5, (a6, (a7, (a8, (a9, a10)))))))))- = (a, b, c, a4, a5, a6, a7, a8, a9, a10)-unflatten10 (a, b, c, a4, a5, a6, a7, a8, a9, a10)- = (a, (b, (c, (a4, (a5, (a6, (a7, (a8, (a9, a10)))))))))--flatten11 (a, (b, (c, (a4, (a5, (a6, (a7, (a8, (a9, (a10, a11))))))))))- = (a, b, c, a4, a5, a6, a7, a8, a9, a10, a11)-unflatten11 (a, b, c, a4, a5, a6, a7, a8, a9, a10, a11)- = (a, (b, (c, (a4, (a5, (a6, (a7, (a8, (a9, (a10, a11))))))))))--flatten12 (a, (b, (c, (a4, (a5, (a6, (a7, (a8, (a9, (a10, (a11, a12)))))))))))- = (a, b, c, a4, a5, a6, a7, a8, a9, a10, a11, a12)-unflatten12 (a, b, c, a4, a5, a6, a7, a8, a9, a10, a11, a12)- = (a, (b, (c, (a4, (a5, (a6, (a7, (a8, (a9, (a10, (a11, a12)))))))))))--flatten13 (a, (b, (c, (a4, (a5, (a6, (a7, (a8, (a9, (a10, (a11, (a12,- a13))))))))))))- = (a, b, c, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13)-unflatten13 (a, b, c, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13)- = (a, (b, (c, (a4, (a5, (a6, (a7, (a8, (a9, (a10, (a11, (a12, a13))))))))))))--flatten14 (a, (b, (c, (a4, (a5, (a6, (a7, (a8, (a9, (a10, (a11, (a12,- (a13, a14)))))))))))))- = (a, b, c, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14)-unflatten14 (a, b, c, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14)- = (a, (b, (c, (a4, (a5, (a6, (a7, (a8, (a9, (a10, (a11, (a12, (a13, a14)))))))))))))--flatten15 (a, (b, (c, (a4, (a5, (a6, (a7, (a8, (a9, (a10, (a11, (a12,- (a13, (a14, a15))))))))))))))- = (a, b, c, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15)-unflatten15 (a, b, c, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15)- = (a, (b, (c, (a4, (a5, (a6, (a7, (a8, (a9, (a10, (a11, (a12, (a13, (a14, a15))))))))))))))--flatten16 (a, (b, (c, (a4, (a5, (a6, (a7, (a8, (a9, (a10, (a11, (a12,- (a13, (a14, (a15, a16)))))))))))))))- = (a, b, c, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16)-unflatten16 (a, b, c, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16)- = (a, (b, (c, (a4, (a5, (a6, (a7, (a8, (a9, (a10, (a11, (a12, (a13, (a14, (a15, a16)))))))))))))))--flatten17 (a, (b, (c, (a4, (a5, (a6, (a7, (a8, (a9, (a10, (a11, (a12,- (a13, (a14, (a15, (a16, a17))))))))))))))))- = (a, b, c, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17)-unflatten17 (a, b, c, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17)- = (a, (b, (c, (a4, (a5, (a6, (a7, (a8, (a9, (a10, (a11, (a12, (a13, (a14, (a15, (a16, a17))))))))))))))))--flatten18 (a, (b, (c, (a4, (a5, (a6, (a7, (a8, (a9, (a10, (a11, (a12,- (a13, (a14, (a15, (a16, (a17, a18)))))))))))))))))- = (a, b, c, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18)-unflatten18 (a, b, c, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18)- = (a, (b, (c, (a4, (a5, (a6, (a7, (a8, (a9, (a10, (a11, (a12, (a13, (a14, (a15, (a16, (a17, a18)))))))))))))))))--flatten19 (a, (b, (c, (a4, (a5, (a6, (a7, (a8, (a9, (a10, (a11, (a12,- (a13, (a14, (a15, (a16, (a17, (a18, a19))))))))))))))))))- = (a, b, c, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19)-unflatten19 (a, b, c, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19)- = (a, (b, (c, (a4, (a5, (a6, (a7, (a8, (a9, (a10, (a11, (a12, (a13, (a14, (a15, (a16, (a17, (a18, a19))))))))))))))))))--flatten20 (a, (b, (c, (a4, (a5, (a6, (a7, (a8, (a9, (a10, (a11, (a12,- (a13, (a14, (a15, (a16, (a17, (a18, (a19, a20)))))))))))))))))))- = (a, b, c, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20)-unflatten20 (a, b, c, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20)- = (a, (b, (c, (a4, (a5, (a6, (a7, (a8, (a9, (a10, (a11, (a12, (a13, (a14, (a15, (a16, (a17, (a18, (a19, a20)))))))))))))))))))--flatten21 (a, (b, (c, (a4, (a5, (a6, (a7, (a8, (a9, (a10, (a11, (a12,- (a13, (a14, (a15, (a16, (a17, (a18, (a19, (a20, a21))))))))))))))))))))- = (a, b, c, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21)-unflatten21 (a, b, c, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21)- = (a, (b, (c, (a4, (a5, (a6, (a7, (a8, (a9, (a10, (a11, (a12, (a13, (a14, (a15, (a16, (a17, (a18, (a19, (a20, a21))))))))))))))))))))--flatten22 (a, (b, (c, (a4, (a5, (a6, (a7, (a8, (a9, (a10, (a11, (a12,- (a13, (a14, (a15, (a16, (a17, (a18, (a19, (a20, (a21, a22)))))))))))))))))))))- = (a, b, c, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22)-unflatten22 (a, b, c, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22)- = (a, (b, (c, (a4, (a5, (a6, (a7, (a8, (a9, (a10, (a11, (a12, (a13, (a14, (a15, (a16, (a17, (a18, (a19, (a20, (a21, a22)))))))))))))))))))))--flatten23 (a, (b, (c, (a4, (a5, (a6, (a7, (a8, (a9, (a10, (a11, (a12,- (a13, (a14, (a15, (a16, (a17, (a18, (a19, (a20, (a21, (a22, a23))))))))))))))))))))))- = (a, b, c, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23)-unflatten23 (a, b, c, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23)- = (a, (b, (c, (a4, (a5, (a6, (a7, (a8, (a9, (a10, (a11, (a12, (a13, (a14, (a15, (a16, (a17, (a18, (a19, (a20, (a21, (a22, a23))))))))))))))))))))))+import Data.Profunctor.Product.Tuples.TH (mkFlattenNs, mkUnflattenNs, maxTupleSize) -flatten24 (a, (b, (c, (a4, (a5, (a6, (a7, (a8, (a9, (a10, (a11, (a12,- (a13, (a14, (a15, (a16, (a17, (a18, (a19, (a20, (a21, (a22, (a23, a24)))))))))))))))))))))))- = (a, b, c, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24)-unflatten24 (a, b, c, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24)- = (a, (b, (c, (a4, (a5, (a6, (a7, (a8, (a9, (a10, (a11, (a12, (a13, (a14, (a15, (a16, (a17, (a18, (a19, (a20, (a21, (a22, (a23, a24)))))))))))))))))))))))+mkFlattenNs [0..maxTupleSize]+mkUnflattenNs [0..maxTupleSize]
Data/Profunctor/Product/Internal/TH.hs view
@@ -1,11 +1,10 @@+{-# LANGUAGE CPP #-} {-# LANGUAGE TemplateHaskell #-} module Data.Profunctor.Product.Internal.TH where import Data.Profunctor (dimap)-import Data.Profunctor.Product (ProductProfunctor, p1, p2, p3, p4, p5, p6, p7,- p8, p9, p10, p11, p12, p13, p14, p15, p16, p17,- p18, p19, p20, p21, p22, p23, p24)+import Data.Profunctor.Product import Data.Profunctor.Product.Default (Default, def) import qualified Data.Profunctor.Product.Newtype as N import Language.Haskell.TH (Dec(DataD, SigD, FunD, InstanceD, NewtypeD),@@ -58,16 +57,27 @@ let body = [ FunD 'N.constructor [simpleClause (NormalB (ConE conName))] , FunD 'N.field [simpleClause (NormalB (LamE [ConP conName [VarP x]] (VarE x)))] ]-+#if __GLASGOW_HASKELL__ >= 800+ return [InstanceD Nothing [] (ConT ''N.Newtype `AppT` ConT tyName) body]+#else return [InstanceD [] (ConT ''N.Newtype `AppT` ConT tyName) body]+#endif dataDecStuffOfInfo :: Info -> Either Error (Name, [Name], Name, [Name])+#if __GLASGOW_HASKELL__ >= 800+dataDecStuffOfInfo (TyConI (DataD _cxt tyName tyVars _kind constructors _deriving)) =+#else dataDecStuffOfInfo (TyConI (DataD _cxt tyName tyVars constructors _deriving)) =+#endif do (conName, conTys) <- extractConstructorStuff constructors let tyVars' = map varNameOfBinder tyVars return (tyName, tyVars', conName, conTys)+#if __GLASGOW_HASKELL__ >= 800+dataDecStuffOfInfo (TyConI (NewtypeD _cxt tyName tyVars _kind constructor _deriving)) =+#else dataDecStuffOfInfo (TyConI (NewtypeD _cxt tyName tyVars constructor _deriving)) =+#endif do (conName, conTys) <- extractConstructorStuff [constructor] let tyVars' = map varNameOfBinder tyVars@@ -103,8 +113,13 @@ instanceDefinition :: Name -> Int -> Int -> Name -> Name -> Q Dec instanceDefinition tyName' numTyVars numConVars adaptorName' conName=instanceDec- where instanceDec = fmap (\i -> InstanceD i instanceType [defDefinition])- instanceCxt+ where instanceDec = fmap+#if __GLASGOW_HASKELL__ >= 800+ (\i -> InstanceD Nothing i instanceType [defDefinition])+#else+ (\i -> InstanceD i instanceType [defDefinition])+#endif+ instanceCxt instanceCxt = mapM (uncurry classP) (pClass:defClasses) pClass :: Monad m => (Name, [m Type]) pClass = (''ProductProfunctor, [return (varTS "p")])@@ -177,6 +192,17 @@ 22 -> 'p22 23 -> 'p23 24 -> 'p24+ 25 -> 'p25+ 26 -> 'p26+ 27 -> 'p27+ 28 -> 'p28+ 29 -> 'p29+ 30 -> 'p30+ 31 -> 'p31+ 32 -> 'p32+ 33 -> 'p33+ 34 -> 'p34+ 35 -> 'p35 _ -> error errorMsg where errorMsg = "Data.Profunctor.Product.TH: " ++ show n
Data/Profunctor/Product/TH.hs view
@@ -18,7 +18,7 @@ -- \"adaptor\" with the following splice: -- -- @--- $(makeAdaptorAndInstance \"pFoo\" ''Foo)+-- $(makeAdaptorAndInstance \"pFoo\" ''Foo) -- @ -- -- The adaptor for a type @Foo@ is by convention called @pFoo@, but in@@ -26,7 +26,7 @@ -- the name @pFoo@ yourself you can use -- -- @--- $(makeAdaptorAndInstance' ''Foo)+-- $(makeAdaptorAndInstance' ''Foo) -- @ -- -- and it will be named @pFoo@ automatically.@@ -51,7 +51,7 @@ -- -- @ -- pFooApplicative :: Applicative f =>--- Foo (f a) (f b) (f c) -> f (Foo a b c) +-- Foo (f a) (f b) (f c) -> f (Foo a b c) -- @ -- -- The product-profunctor \"adaptor\" (in this case @pFoo@) is a@@ -89,8 +89,8 @@ -- @Applicative@ case. For an @Applicative@ we would write -- -- @--- pFooApplicative :: Applicative f =>--- Foo (f a) (f b) (f c) -> f (Foo a b c)+-- pFooApplicative :: Applicative f+-- => Foo (f a) (f b) (f c) -> f (Foo a b c) -- pFooApplicative f = Foo \<$\> foo f -- \<*\> bar f -- \<*\> baz f@@ -102,8 +102,8 @@ -- import Data.Profunctor (lmap) -- import Data.Profunctor.Product ((***$), (****)) ----- pFoo :: ProductProfunctor p =>--- Foo (p a a') (p b b') (p c c') -> p (Foo a b c) (Foo a' b' c')+-- pFoo :: ProductProfunctor p+-- => Foo (p a a') (p b b') (p c c') -> p (Foo a b c) (Foo a' b' c') -- pFoo f = Foo ***$ lmap foo (foo f) -- **** lmap bar (bar f) -- **** lmap baz (baz f)
Data/Profunctor/Product/Tuples.hs view
@@ -1,39 +1,6 @@+{-# LANGUAGE TemplateHaskell #-} module Data.Profunctor.Product.Tuples where -type T0 = ()-type T1 a = a-type T2 a b = (a, T1 b)-type T3 a b c = (a, T2 b c)-type T4 a b c d = (a, T3 b c d)-type T5 a b c d e = (a, T4 b c d e)-type T6 a b c d e f = (a, T5 b c d e f)-type T7 a b c d e f g = (a, T6 b c d e f g)-type T8 a b c d e f g h = (a, T7 b c d e f g h)-type T9 a b c d e f g h a9 = (a, T8 b c d e f g h a9)-type T10 a b c d e f g h a9 a10 = (a, T9 b c d e f g h a9 a10)-type T11 a b c d e f g h a9 a10 a11 = (a, T10 b c d e f g h a9 a10 a11)-type T12 a b c d e f g h a9 a10 a11 a12 = (a, T11 b c d e f g h a9 a10 a11 a12)-type T13 a b c d e f g h a9 a10 a11 a12 a13 =- (a, T12 b c d e f g h a9 a10 a11 a12 a13)-type T14 a b c d e f g h a9 a10 a11 a12 a13 a14 =- (a, T13 b c d e f g h a9 a10 a11 a12 a13 a14)-type T15 a b c d e f g h a9 a10 a11 a12 a13 a14 a15 =- (a, T14 b c d e f g h a9 a10 a11 a12 a13 a14 a15)-type T16 a b c d e f g h a9 a10 a11 a12 a13 a14 a15 a16 =- (a, T15 b c d e f g h a9 a10 a11 a12 a13 a14 a15 a16)-type T17 a b c d e f g h a9 a10 a11 a12 a13 a14 a15 a16 a17 =- (a, T16 b c d e f g h a9 a10 a11 a12 a13 a14 a15 a16 a17)-type T18 a b c d e f g h a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 =- (a, T17 b c d e f g h a9 a10 a11 a12 a13 a14 a15 a16 a17 a18)-type T19 a b c d e f g h a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 =- (a, T18 b c d e f g h a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19)-type T20 a b c d e f g h a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 =- (a, T19 b c d e f g h a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20)-type T21 a b c d e f g h a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 a21 =- (a, T20 b c d e f g h a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 a21)-type T22 a b c d e f g h a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 a21 a22 =- (a, T21 b c d e f g h a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 a21 a22)-type T23 a b c d e f g h a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 a21 a22 a23 =- (a, T22 b c d e f g h a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 a21 a22 a23)-type T24 a b c d e f g h a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 a21 a22 a23 a24 =- (a, T23 b c d e f g h a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 a21 a22 a23 a24)+import Data.Profunctor.Product.Tuples.TH++mkTs [0..35]
+ Data/Profunctor/Product/Tuples/TH.hs view
@@ -0,0 +1,164 @@+{-# LANGUAGE TemplateHaskell #-}+module Data.Profunctor.Product.Tuples.TH+ ( mkTs+ , pTns+ , mkFlattenNs+ , mkUnflattenNs+ , pNs+ , mkDefaultNs+ , maxTupleSize+ ) where++import Language.Haskell.TH++import Data.Profunctor (Profunctor (dimap))+import Data.Profunctor.Product.Class (ProductProfunctor, (***!), empty)+import Data.Profunctor.Product.Default.Class (Default (def))++mkTs :: [Int] -> Q [Dec]+mkTs = mapM mkT++mkT :: Int -> Q Dec+mkT n = tySynD (tyName n) tyVars tyDef+ where+ tyName n' = mkName ('T':show n')+ tyVars = map PlainTV . take n $ allNames+ tyDef = case n of+ 0 -> tupleT 0+ 1 -> varT (head allNames)+ _ -> tupleT 2 `appT` varT (head allNames) `appT` applyT (n - 1)+ applyT n' = foldl (\t v -> t `appT` varT v) (conT (tyName n')) (take n' (tail allNames))+ allNames = [ mkName $ c:show i | i <- [0::Int ..], c <- ['a'..'z'] ]++chain :: ProductProfunctor p => (t -> p a2 b2) -> (p a1 b1, t)+ -> p (a1, a2) (b1, b2)+chain rest (a, as) = uncurry (***!) (a, rest as)++pTns :: [Int] -> Q [Dec]+pTns = fmap concat . mapM pTn++pTn :: Int -> Q [Dec]+pTn n = sequence [sig, fun]+ where+ p = mkName "p"+ sig = sigD (pT n) (forallT (map PlainTV $ p : take n as ++ take n bs)+ (pure [ConT ''ProductProfunctor `AppT` VarT p])+ (arrowT `appT` mkLeftTy `appT` mkRightTy)+ )+ mkLeftTy = foldl appT (conT tN)+ $ zipWith (\a b -> varT p `appT` varT a `appT` varT b) (take n as) (take n bs)+ mkRightTy = varT p `appT` foldl appT (conT tN) (map varT . take n $ as)+ `appT` foldl appT (conT tN) (map varT . take n $ bs)+ fun = funD (pT n) [ clause [] (normalB bdy) [] ]+ bdy = case n of+ 0 -> [| const empty |]+ 1 -> [| id |]+ 2 -> [| uncurry (***!) |]+ _ -> varE 'chain `appE` varE (pT (n - 1))+ pT n' = mkName ("pT" ++ show n')+ tN = mkName ('T':show n)+ as = [ mkName $ 'a':show i | i <- [0::Int ..] ]+ bs = [ mkName $ 'b':show i | i <- [0::Int ..] ]++mkFlattenNs :: [Int] -> Q [Dec]+mkFlattenNs = fmap concat . mapM mkFlattenN++mkFlattenN :: Int -> Q [Dec]+mkFlattenN n = sequence [sig, fun]+ where+ sig = sigD nm (forallT (map PlainTV names) (pure []) $ arrowT `appT` unflatT names `appT` flatT names)+ fun = funD nm [ clause [mkTupPat names] (normalB bdy) [] ]+ bdy = mkFlatExp names+ unflatT [] = tupleT 0+ unflatT [v] = varT v+ unflatT (v:vs) = tupleT 2 `appT` varT v `appT` unflatT vs+ flatT [] = tupleT 0+ flatT [v] = varT v+ flatT vs = foldl appT (tupleT (length vs)) (map varT vs)+ mkTupPat [] = tupP []+ mkTupPat [v] = varP v+ mkTupPat (v:vs) = tupP [varP v, mkTupPat vs]+ mkFlatExp [] = tupE []+ mkFlatExp [v] = varE v+ mkFlatExp vs = tupE (map varE vs)+ nm = mkName ("flatten" ++ show n)+ names = take n [ mkName $ c:show i | i <- [0::Int ..], c <- ['a'..'z'] ]++mkUnflattenNs :: [Int] -> Q [Dec]+mkUnflattenNs = fmap concat . mapM mkUnflattenN++mkUnflattenN :: Int -> Q [Dec]+mkUnflattenN n = sequence [sig, fun]+ where+ sig = sigD nm (forallT (map PlainTV names) (pure []) $ arrowT `appT` flatT names `appT` unflatT names)+ fun = funD nm [ clause [mkTupPat names] (normalB bdy) [] ]+ bdy = mkUnflatExp names+ unflatT [] = tupleT 0+ unflatT [v] = varT v+ unflatT (v:vs) = tupleT 2 `appT` varT v `appT` unflatT vs+ flatT [] = tupleT 0+ flatT [v] = varT v+ flatT vs = foldl appT (tupleT (length vs)) (map varT vs)+ mkTupPat [] = tupP []+ mkTupPat [v] = varP v+ mkTupPat vs = tupP (map varP vs)+ mkUnflatExp [] = tupE []+ mkUnflatExp [v] = varE v+ mkUnflatExp (v:vs) = tupE [varE v, mkUnflatExp vs]+ nm = mkName ("unflatten" ++ show n)+ names = take n [ mkName $ c:show i | i <- [0::Int ..], c <- ['a'..'z'] ]++pNs :: [Int] -> Q [Dec]+pNs = fmap concat . mapM pN++pN :: Int -> Q [Dec]+pN n = sequence [sig, fun]+ where+ sig = sigD nm (forallT (map PlainTV $ p : as ++ bs)+ (pure [ConT ''ProductProfunctor `AppT` VarT p])+ (arrowT `appT` mkLeftTy `appT` mkRightTy)+ )+ mkLeftTy = case n of+ 1 -> mkPT (head as) (head bs)+ _ -> foldl appT (tupleT n) (zipWith mkPT as bs)+ mkRightTy = varT p `appT` mkTupT as `appT` mkTupT bs+ mkTupT = foldl appT (tupleT n) . map varT+ mkPT a b = varT p `appT` varT a `appT` varT b+ fun = funD nm [ clause [] (normalB bdy) [] ]+ bdy = varE 'convert `appE` unflat `appE` unflat `appE` flat `appE` pT+ unflat = varE $ mkName unflatNm+ flat = varE $ mkName flatNm+ pT = varE $ mkName pTNm+ unflatNm = "unflatten" ++ show n+ flatNm = "flatten" ++ show n+ pTNm = "pT" ++ show n+ nm = mkName ('p':show n)+ p = mkName "p"+ as = take n [ mkName $ 'a':show i | i <- [0::Int ..] ]+ bs = take n [ mkName $ 'b':show i | i <- [0::Int ..] ]++convert :: Profunctor p => (a2 -> a1) -> (tp -> tTp) -> (b1 -> b2)+ -> (tTp -> p a1 b1)+ -> tp -> p a2 b2+convert u u' f c = dimap u f . c . u'++mkDefaultNs :: [Int] -> Q [Dec]+mkDefaultNs = mapM mkDefaultN++mkDefaultN :: Int -> Q Dec+mkDefaultN n = instanceD (pure (ConT ''ProductProfunctor `AppT` VarT p : mkDefs))+ (conT ''Default `appT` varT p `appT` mkTupT as `appT` mkTupT bs)+ [mkFun]+ where+ mkDefs = zipWith (\a b -> ConT ''Default `AppT` VarT p `AppT` VarT a `AppT` VarT b) as bs+ mkTupT = foldl appT (tupleT n) . map varT+ mkFun = funD 'def [clause [] bdy []]+ bdy = normalB $ case n of+ 0 -> varE 'empty+ _ -> varE (mkName $ 'p':show n) `appE` tupE (replicate n (varE 'def))+ p = mkName "p"+ as = take n [ mkName $ 'a':show i | i <- [0::Int ..] ]+ bs = take n [ mkName $ 'b':show i | i <- [0::Int ..] ]++maxTupleSize :: Int+maxTupleSize = 35
product-profunctors.cabal view
@@ -1,5 +1,5 @@ name: product-profunctors-version: 0.7.0.2+version: 0.7.1.0 synopsis: product-profunctors description: Product profunctors homepage: https://github.com/tomjaguarpaw/product-profunctors@@ -19,6 +19,7 @@ build-depends: base >= 4.5 && < 5 , profunctors >= 4.0 && < 5.3 , contravariant >= 0.4 && < 1.5+ , tagged >= 0.0 && < 1 , template-haskell exposed-modules: Data.Profunctor.Product, Data.Profunctor.Product.Default,@@ -27,7 +28,13 @@ Data.Profunctor.Product.Newtype, Data.Profunctor.Product.TH, Data.Profunctor.Product.Tuples+ Data.Profunctor.Product.Tuples.TH+ other-modules: Data.Profunctor.Product.Class,+ Data.Profunctor.Product.Default.Class ghc-options: -Wall++ if impl(ghc < 7.10)+ build-depends: transformers >= 0.2 && < 0.6 test-suite test type: exitcode-stdio-1.0