feat(third_party/bazel): Check in rules_haskell from Tweag
This commit is contained in:
		
							parent
							
								
									2eb1dc26e4
								
							
						
					
					
						commit
						f723b8b878
					
				
					 479 changed files with 51484 additions and 0 deletions
				
			
		
							
								
								
									
										259
									
								
								third_party/bazel/rules_haskell/examples/transformers/legacy/pre709/Data/Functor/Identity.hs
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										259
									
								
								third_party/bazel/rules_haskell/examples/transformers/legacy/pre709/Data/Functor/Identity.hs
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,259 @@ | |||
| {-# LANGUAGE CPP #-} | ||||
| #if __GLASGOW_HASKELL__ >= 700 | ||||
| {-# LANGUAGE DeriveDataTypeable #-} | ||||
| #endif | ||||
| #if __GLASGOW_HASKELL__ >= 702 | ||||
| {-# LANGUAGE DeriveGeneric #-} | ||||
| {-# LANGUAGE Trustworthy #-} | ||||
| #endif | ||||
| #if __GLASGOW_HASKELL__ >= 706 | ||||
| {-# LANGUAGE PolyKinds #-} | ||||
| #endif | ||||
| #if __GLASGOW_HASKELL__ >= 708 | ||||
| {-# LANGUAGE AutoDeriveTypeable #-} | ||||
| {-# LANGUAGE DataKinds #-} | ||||
| #endif | ||||
| #if MIN_VERSION_base(4,7,0) | ||||
| -- We need to implement bitSize for the Bits instance, but it's deprecated. | ||||
| {-# OPTIONS_GHC -fno-warn-deprecations #-} | ||||
| #endif | ||||
| ----------------------------------------------------------------------------- | ||||
| -- | | ||||
| -- Module      :  Data.Functor.Identity | ||||
| -- Copyright   :  (c) Andy Gill 2001, | ||||
| --                (c) Oregon Graduate Institute of Science and Technology 2001 | ||||
| -- License     :  BSD-style (see the file LICENSE) | ||||
| -- | ||||
| -- Maintainer  :  ross@soi.city.ac.uk | ||||
| -- Stability   :  experimental | ||||
| -- Portability :  portable | ||||
| -- | ||||
| -- The identity functor and monad. | ||||
| -- | ||||
| -- This trivial type constructor serves two purposes: | ||||
| -- | ||||
| -- * It can be used with functions parameterized by functor or monad classes. | ||||
| -- | ||||
| -- * It can be used as a base monad to which a series of monad | ||||
| --   transformers may be applied to construct a composite monad. | ||||
| --   Most monad transformer modules include the special case of | ||||
| --   applying the transformer to 'Identity'.  For example, @State s@ | ||||
| --   is an abbreviation for @StateT s 'Identity'@. | ||||
| ----------------------------------------------------------------------------- | ||||
| 
 | ||||
| module Data.Functor.Identity ( | ||||
|     Identity(..), | ||||
|   ) where | ||||
| 
 | ||||
| import Data.Bits | ||||
| import Control.Applicative | ||||
| import Control.Arrow (Arrow((***))) | ||||
| import Control.Monad.Fix | ||||
| #if MIN_VERSION_base(4,4,0) | ||||
| import Control.Monad.Zip (MonadZip(mzipWith, munzip)) | ||||
| #endif | ||||
| import Data.Foldable (Foldable(foldMap)) | ||||
| import Data.Monoid (Monoid(mempty, mappend)) | ||||
| import Data.String (IsString(fromString)) | ||||
| import Data.Traversable (Traversable(traverse)) | ||||
| #if __GLASGOW_HASKELL__ >= 700 | ||||
| import Data.Data | ||||
| #endif | ||||
| import Data.Ix (Ix(..)) | ||||
| import Foreign (Storable(..), castPtr) | ||||
| #if __GLASGOW_HASKELL__ >= 702 | ||||
| import GHC.Generics | ||||
| #endif | ||||
| 
 | ||||
| -- | Identity functor and monad. (a non-strict monad) | ||||
| newtype Identity a = Identity { runIdentity :: a } | ||||
|     deriving ( Eq, Ord | ||||
| #if __GLASGOW_HASKELL__ >= 700 | ||||
|              , Data, Typeable | ||||
| #endif | ||||
| #if __GLASGOW_HASKELL__ >= 702 | ||||
|              , Generic | ||||
| #endif | ||||
| #if __GLASGOW_HASKELL__ >= 706 | ||||
|              , Generic1 | ||||
| #endif | ||||
|              ) | ||||
| 
 | ||||
| instance (Bits a) => Bits (Identity a) where | ||||
|     Identity x .&. Identity y     = Identity (x .&. y) | ||||
|     Identity x .|. Identity y     = Identity (x .|. y) | ||||
|     xor (Identity x) (Identity y) = Identity (xor x y) | ||||
|     complement   (Identity x)     = Identity (complement x) | ||||
|     shift        (Identity x) i   = Identity (shift    x i) | ||||
|     rotate       (Identity x) i   = Identity (rotate   x i) | ||||
|     setBit       (Identity x) i   = Identity (setBit   x i) | ||||
|     clearBit     (Identity x) i   = Identity (clearBit x i) | ||||
|     shiftL       (Identity x) i   = Identity (shiftL   x i) | ||||
|     shiftR       (Identity x) i   = Identity (shiftR   x i) | ||||
|     rotateL      (Identity x) i   = Identity (rotateL  x i) | ||||
|     rotateR      (Identity x) i   = Identity (rotateR  x i) | ||||
|     testBit      (Identity x) i   = testBit x i | ||||
|     bitSize      (Identity x)     = bitSize x | ||||
|     isSigned     (Identity x)     = isSigned x | ||||
|     bit i                         = Identity (bit i) | ||||
| #if MIN_VERSION_base(4,5,0) | ||||
|     unsafeShiftL (Identity x) i   = Identity (unsafeShiftL x i) | ||||
|     unsafeShiftR (Identity x) i   = Identity (unsafeShiftR x i) | ||||
|     popCount     (Identity x)     = popCount x | ||||
| #endif | ||||
| #if MIN_VERSION_base(4,7,0) | ||||
|     zeroBits                      = Identity zeroBits | ||||
|     bitSizeMaybe (Identity x)     = bitSizeMaybe x | ||||
| #endif | ||||
| 
 | ||||
| instance (Bounded a) => Bounded (Identity a) where | ||||
|     minBound = Identity minBound | ||||
|     maxBound = Identity maxBound | ||||
| 
 | ||||
| instance (Enum a) => Enum (Identity a) where | ||||
|     succ (Identity x)     = Identity (succ x) | ||||
|     pred (Identity x)     = Identity (pred x) | ||||
|     toEnum i              = Identity (toEnum i) | ||||
|     fromEnum (Identity x) = fromEnum x | ||||
|     enumFrom (Identity x) = map Identity (enumFrom x) | ||||
|     enumFromThen (Identity x) (Identity y) = map Identity (enumFromThen x y) | ||||
|     enumFromTo   (Identity x) (Identity y) = map Identity (enumFromTo   x y) | ||||
|     enumFromThenTo (Identity x) (Identity y) (Identity z) = | ||||
|         map Identity (enumFromThenTo x y z) | ||||
| 
 | ||||
| #if MIN_VERSION_base(4,7,0) | ||||
| instance (FiniteBits a) => FiniteBits (Identity a) where | ||||
|     finiteBitSize (Identity x) = finiteBitSize x | ||||
| #endif | ||||
| 
 | ||||
| instance (Floating a) => Floating (Identity a) where | ||||
|     pi                                = Identity pi | ||||
|     exp   (Identity x)                = Identity (exp x) | ||||
|     log   (Identity x)                = Identity (log x) | ||||
|     sqrt  (Identity x)                = Identity (sqrt x) | ||||
|     sin   (Identity x)                = Identity (sin x) | ||||
|     cos   (Identity x)                = Identity (cos x) | ||||
|     tan   (Identity x)                = Identity (tan x) | ||||
|     asin  (Identity x)                = Identity (asin x) | ||||
|     acos  (Identity x)                = Identity (acos x) | ||||
|     atan  (Identity x)                = Identity (atan x) | ||||
|     sinh  (Identity x)                = Identity (sinh x) | ||||
|     cosh  (Identity x)                = Identity (cosh x) | ||||
|     tanh  (Identity x)                = Identity (tanh x) | ||||
|     asinh (Identity x)                = Identity (asinh x) | ||||
|     acosh (Identity x)                = Identity (acosh x) | ||||
|     atanh (Identity x)                = Identity (atanh x) | ||||
|     Identity x ** Identity y          = Identity (x ** y) | ||||
|     logBase (Identity x) (Identity y) = Identity (logBase x y) | ||||
| 
 | ||||
| instance (Fractional a) => Fractional (Identity a) where | ||||
|     Identity x / Identity y = Identity (x / y) | ||||
|     recip (Identity x)      = Identity (recip x) | ||||
|     fromRational r          = Identity (fromRational r) | ||||
| 
 | ||||
| instance (IsString a) => IsString (Identity a) where | ||||
|     fromString s = Identity (fromString s) | ||||
| 
 | ||||
| instance (Ix a) => Ix (Identity a) where | ||||
|     range     (Identity x, Identity y) = map Identity (range (x, y)) | ||||
|     index     (Identity x, Identity y) (Identity i) = index     (x, y) i | ||||
|     inRange   (Identity x, Identity y) (Identity e) = inRange   (x, y) e | ||||
|     rangeSize (Identity x, Identity y) = rangeSize (x, y) | ||||
| 
 | ||||
| instance (Integral a) => Integral (Identity a) where | ||||
|     quot    (Identity x) (Identity y) = Identity (quot x y) | ||||
|     rem     (Identity x) (Identity y) = Identity (rem  x y) | ||||
|     div     (Identity x) (Identity y) = Identity (div  x y) | ||||
|     mod     (Identity x) (Identity y) = Identity (mod  x y) | ||||
|     quotRem (Identity x) (Identity y) = (Identity *** Identity) (quotRem x y) | ||||
|     divMod  (Identity x) (Identity y) = (Identity *** Identity) (divMod  x y) | ||||
|     toInteger (Identity x)            = toInteger x | ||||
| 
 | ||||
| instance (Monoid a) => Monoid (Identity a) where | ||||
|     mempty = Identity mempty | ||||
|     mappend (Identity x) (Identity y) = Identity (mappend x y) | ||||
| 
 | ||||
| instance (Num a) => Num (Identity a) where | ||||
|     Identity x + Identity y = Identity (x + y) | ||||
|     Identity x - Identity y = Identity (x - y) | ||||
|     Identity x * Identity y = Identity (x * y) | ||||
|     negate (Identity x)     = Identity (negate x) | ||||
|     abs    (Identity x)     = Identity (abs    x) | ||||
|     signum (Identity x)     = Identity (signum x) | ||||
|     fromInteger n           = Identity (fromInteger n) | ||||
| 
 | ||||
| instance (Real a) => Real (Identity a) where | ||||
|     toRational (Identity x) = toRational x | ||||
| 
 | ||||
| instance (RealFloat a) => RealFloat (Identity a) where | ||||
|     floatRadix     (Identity x)     = floatRadix     x | ||||
|     floatDigits    (Identity x)     = floatDigits    x | ||||
|     floatRange     (Identity x)     = floatRange     x | ||||
|     decodeFloat    (Identity x)     = decodeFloat    x | ||||
|     exponent       (Identity x)     = exponent       x | ||||
|     isNaN          (Identity x)     = isNaN          x | ||||
|     isInfinite     (Identity x)     = isInfinite     x | ||||
|     isDenormalized (Identity x)     = isDenormalized x | ||||
|     isNegativeZero (Identity x)     = isNegativeZero x | ||||
|     isIEEE         (Identity x)     = isIEEE         x | ||||
|     significand    (Identity x)     = significand (Identity x) | ||||
|     scaleFloat s   (Identity x)     = Identity (scaleFloat s x) | ||||
|     encodeFloat m n                 = Identity (encodeFloat m n) | ||||
|     atan2 (Identity x) (Identity y) = Identity (atan2 x y) | ||||
| 
 | ||||
| instance (RealFrac a) => RealFrac (Identity a) where | ||||
|     properFraction (Identity x) = (id *** Identity) (properFraction x) | ||||
|     truncate       (Identity x) = truncate x | ||||
|     round          (Identity x) = round    x | ||||
|     ceiling        (Identity x) = ceiling  x | ||||
|     floor          (Identity x) = floor    x | ||||
| 
 | ||||
| instance (Storable a) => Storable (Identity a) where | ||||
|     sizeOf    (Identity x)       = sizeOf x | ||||
|     alignment (Identity x)       = alignment x | ||||
|     peekElemOff p i              = fmap Identity (peekElemOff (castPtr p) i) | ||||
|     pokeElemOff p i (Identity x) = pokeElemOff (castPtr p) i x | ||||
|     peekByteOff p i              = fmap Identity (peekByteOff p i) | ||||
|     pokeByteOff p i (Identity x) = pokeByteOff p i x | ||||
|     peek p                       = fmap runIdentity (peek (castPtr p)) | ||||
|     poke p (Identity x)          = poke (castPtr p) x | ||||
| 
 | ||||
| -- These instances would be equivalent to the derived instances of the | ||||
| -- newtype if the field were removed. | ||||
| 
 | ||||
| instance (Read a) => Read (Identity a) where | ||||
|     readsPrec d = readParen (d > 10) $ \ r -> | ||||
|         [(Identity x,t) | ("Identity",s) <- lex r, (x,t) <- readsPrec 11 s] | ||||
| 
 | ||||
| instance (Show a) => Show (Identity a) where | ||||
|     showsPrec d (Identity x) = showParen (d > 10) $ | ||||
|         showString "Identity " . showsPrec 11 x | ||||
| 
 | ||||
| -- --------------------------------------------------------------------------- | ||||
| -- Identity instances for Functor and Monad | ||||
| 
 | ||||
| instance Functor Identity where | ||||
|     fmap f m = Identity (f (runIdentity m)) | ||||
| 
 | ||||
| instance Foldable Identity where | ||||
|     foldMap f (Identity x) = f x | ||||
| 
 | ||||
| instance Traversable Identity where | ||||
|     traverse f (Identity x) = Identity <$> f x | ||||
| 
 | ||||
| instance Applicative Identity where | ||||
|     pure a = Identity a | ||||
|     Identity f <*> Identity x = Identity (f x) | ||||
| 
 | ||||
| instance Monad Identity where | ||||
|     return a = Identity a | ||||
|     m >>= k  = k (runIdentity m) | ||||
| 
 | ||||
| instance MonadFix Identity where | ||||
|     mfix f = Identity (fix (runIdentity . f)) | ||||
| 
 | ||||
| #if MIN_VERSION_base(4,4,0) | ||||
| instance MonadZip Identity where | ||||
|     mzipWith f (Identity x) (Identity y) = Identity (f x y) | ||||
|     munzip (Identity (a, b)) = (Identity a, Identity b) | ||||
| #endif | ||||
							
								
								
									
										51
									
								
								third_party/bazel/rules_haskell/examples/transformers/legacy/pre711/Control/Monad/IO/Class.hs
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								third_party/bazel/rules_haskell/examples/transformers/legacy/pre711/Control/Monad/IO/Class.hs
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,51 @@ | |||
| {-# LANGUAGE CPP #-} | ||||
| #if __GLASGOW_HASKELL__ >= 702 | ||||
| {-# LANGUAGE Safe #-} | ||||
| #endif | ||||
| #if __GLASGOW_HASKELL__ >= 708 | ||||
| {-# LANGUAGE DeriveDataTypeable #-} | ||||
| {-# LANGUAGE StandaloneDeriving #-} | ||||
| #endif | ||||
| ----------------------------------------------------------------------------- | ||||
| -- | | ||||
| -- Module      :  Control.Monad.IO.Class | ||||
| -- Copyright   :  (c) Andy Gill 2001, | ||||
| --                (c) Oregon Graduate Institute of Science and Technology, 2001 | ||||
| -- License     :  BSD-style (see the file LICENSE) | ||||
| -- | ||||
| -- Maintainer  :  R.Paterson@city.ac.uk | ||||
| -- Stability   :  experimental | ||||
| -- Portability :  portable | ||||
| -- | ||||
| -- Class of monads based on @IO@. | ||||
| ----------------------------------------------------------------------------- | ||||
| 
 | ||||
| module Control.Monad.IO.Class ( | ||||
|     MonadIO(..) | ||||
|   ) where | ||||
| 
 | ||||
| #if __GLASGOW_HASKELL__ >= 708 | ||||
| import Data.Typeable | ||||
| #endif | ||||
| 
 | ||||
| -- | Monads in which 'IO' computations may be embedded. | ||||
| -- Any monad built by applying a sequence of monad transformers to the | ||||
| -- 'IO' monad will be an instance of this class. | ||||
| -- | ||||
| -- Instances should satisfy the following laws, which state that 'liftIO' | ||||
| -- is a transformer of monads: | ||||
| -- | ||||
| -- * @'liftIO' . 'return' = 'return'@ | ||||
| -- | ||||
| -- * @'liftIO' (m >>= f) = 'liftIO' m >>= ('liftIO' . f)@ | ||||
| 
 | ||||
| class (Monad m) => MonadIO m where | ||||
|     -- | Lift a computation from the 'IO' monad. | ||||
|     liftIO :: IO a -> m a | ||||
| 
 | ||||
| #if __GLASGOW_HASKELL__ >= 708 | ||||
| deriving instance Typeable MonadIO | ||||
| #endif | ||||
| 
 | ||||
| instance MonadIO IO where | ||||
|     liftIO = id | ||||
							
								
								
									
										529
									
								
								third_party/bazel/rules_haskell/examples/transformers/legacy/pre711/Data/Functor/Classes.hs
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										529
									
								
								third_party/bazel/rules_haskell/examples/transformers/legacy/pre711/Data/Functor/Classes.hs
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,529 @@ | |||
| {-# LANGUAGE CPP #-} | ||||
| #if __GLASGOW_HASKELL__ >= 702 | ||||
| {-# LANGUAGE Safe #-} | ||||
| #endif | ||||
| #if __GLASGOW_HASKELL__ >= 708 | ||||
| {-# LANGUAGE DeriveDataTypeable #-} | ||||
| {-# LANGUAGE StandaloneDeriving #-} | ||||
| #endif | ||||
| ----------------------------------------------------------------------------- | ||||
| -- | | ||||
| -- Module      :  Data.Functor.Classes | ||||
| -- Copyright   :  (c) Ross Paterson 2013 | ||||
| -- License     :  BSD-style (see the file LICENSE) | ||||
| -- | ||||
| -- Maintainer  :  R.Paterson@city.ac.uk | ||||
| -- Stability   :  experimental | ||||
| -- Portability :  portable | ||||
| -- | ||||
| -- Liftings of the Prelude classes 'Eq', 'Ord', 'Read' and 'Show' to | ||||
| -- unary and binary type constructors. | ||||
| -- | ||||
| -- These classes are needed to express the constraints on arguments of | ||||
| -- transformers in portable Haskell.  Thus for a new transformer @T@, | ||||
| -- one might write instances like | ||||
| -- | ||||
| -- > instance (Eq1 f) => Eq1 (T f) where ... | ||||
| -- > instance (Ord1 f) => Ord1 (T f) where ... | ||||
| -- > instance (Read1 f) => Read1 (T f) where ... | ||||
| -- > instance (Show1 f) => Show1 (T f) where ... | ||||
| -- | ||||
| -- If these instances can be defined, defining instances of the base | ||||
| -- classes is mechanical: | ||||
| -- | ||||
| -- > instance (Eq1 f, Eq a) => Eq (T f a) where (==) = eq1 | ||||
| -- > instance (Ord1 f, Ord a) => Ord (T f a) where compare = compare1 | ||||
| -- > instance (Read1 f, Read a) => Read (T f a) where readsPrec = readsPrec1 | ||||
| -- > instance (Show1 f, Show a) => Show (T f a) where showsPrec = showsPrec1 | ||||
| -- | ||||
| ----------------------------------------------------------------------------- | ||||
| 
 | ||||
| module Data.Functor.Classes ( | ||||
|     -- * Liftings of Prelude classes | ||||
|     -- ** For unary constructors | ||||
|     Eq1(..), eq1, | ||||
|     Ord1(..), compare1, | ||||
|     Read1(..), readsPrec1, | ||||
|     Show1(..), showsPrec1, | ||||
|     -- ** For binary constructors | ||||
|     Eq2(..), eq2, | ||||
|     Ord2(..), compare2, | ||||
|     Read2(..), readsPrec2, | ||||
|     Show2(..), showsPrec2, | ||||
|     -- * Helper functions | ||||
|     -- $example | ||||
|     readsData, | ||||
|     readsUnaryWith, | ||||
|     readsBinaryWith, | ||||
|     showsUnaryWith, | ||||
|     showsBinaryWith, | ||||
|     -- ** Obsolete helpers | ||||
|     readsUnary, | ||||
|     readsUnary1, | ||||
|     readsBinary1, | ||||
|     showsUnary, | ||||
|     showsUnary1, | ||||
|     showsBinary1, | ||||
|   ) where | ||||
| 
 | ||||
| import Control.Applicative (Const(Const)) | ||||
| import Data.Functor.Identity (Identity(Identity)) | ||||
| import Data.Monoid (mappend) | ||||
| #if MIN_VERSION_base(4,7,0) | ||||
| import Data.Proxy (Proxy(Proxy)) | ||||
| #endif | ||||
| #if __GLASGOW_HASKELL__ >= 708 | ||||
| import Data.Typeable | ||||
| #endif | ||||
| import Text.Show (showListWith) | ||||
| 
 | ||||
| -- | Lifting of the 'Eq' class to unary type constructors. | ||||
| class Eq1 f where | ||||
|     -- | Lift an equality test through the type constructor. | ||||
|     -- | ||||
|     -- The function will usually be applied to an equality function, | ||||
|     -- but the more general type ensures that the implementation uses | ||||
|     -- it to compare elements of the first container with elements of | ||||
|     -- the second. | ||||
|     liftEq :: (a -> b -> Bool) -> f a -> f b -> Bool | ||||
| 
 | ||||
| #if __GLASGOW_HASKELL__ >= 708 | ||||
| deriving instance Typeable Eq1 | ||||
| #endif | ||||
| 
 | ||||
| -- | Lift the standard @('==')@ function through the type constructor. | ||||
| eq1 :: (Eq1 f, Eq a) => f a -> f a -> Bool | ||||
| eq1 = liftEq (==) | ||||
| 
 | ||||
| -- | Lifting of the 'Ord' class to unary type constructors. | ||||
| class (Eq1 f) => Ord1 f where | ||||
|     -- | Lift a 'compare' function through the type constructor. | ||||
|     -- | ||||
|     -- The function will usually be applied to a comparison function, | ||||
|     -- but the more general type ensures that the implementation uses | ||||
|     -- it to compare elements of the first container with elements of | ||||
|     -- the second. | ||||
|     liftCompare :: (a -> b -> Ordering) -> f a -> f b -> Ordering | ||||
| 
 | ||||
| #if __GLASGOW_HASKELL__ >= 708 | ||||
| deriving instance Typeable Ord1 | ||||
| #endif | ||||
| 
 | ||||
| -- | Lift the standard 'compare' function through the type constructor. | ||||
| compare1 :: (Ord1 f, Ord a) => f a -> f a -> Ordering | ||||
| compare1 = liftCompare compare | ||||
| 
 | ||||
| -- | Lifting of the 'Read' class to unary type constructors. | ||||
| class Read1 f where | ||||
|     -- | 'readsPrec' function for an application of the type constructor | ||||
|     -- based on 'readsPrec' and 'readList' functions for the argument type. | ||||
|     liftReadsPrec :: (Int -> ReadS a) -> ReadS [a] -> Int -> ReadS (f a) | ||||
| 
 | ||||
|     -- | 'readList' function for an application of the type constructor | ||||
|     -- based on 'readsPrec' and 'readList' functions for the argument type. | ||||
|     -- The default implementation using standard list syntax is correct | ||||
|     -- for most types. | ||||
|     liftReadList :: (Int -> ReadS a) -> ReadS [a] -> ReadS [f a] | ||||
|     liftReadList rp rl = readListWith (liftReadsPrec rp rl 0) | ||||
| 
 | ||||
| #if __GLASGOW_HASKELL__ >= 708 | ||||
| deriving instance Typeable Read1 | ||||
| #endif | ||||
| 
 | ||||
| -- | Read a list (using square brackets and commas), given a function | ||||
| -- for reading elements. | ||||
| readListWith :: ReadS a -> ReadS [a] | ||||
| readListWith rp = | ||||
|     readParen False (\r -> [pr | ("[",s) <- lex r, pr <- readl s]) | ||||
|   where | ||||
|     readl s = [([],t) | ("]",t) <- lex s] ++ | ||||
|         [(x:xs,u) | (x,t) <- rp s, (xs,u) <- readl' t] | ||||
|     readl' s = [([],t) | ("]",t) <- lex s] ++ | ||||
|         [(x:xs,v) | (",",t) <- lex s, (x,u) <- rp t, (xs,v) <- readl' u] | ||||
| 
 | ||||
| -- | Lift the standard 'readsPrec' and 'readList' functions through the | ||||
| -- type constructor. | ||||
| readsPrec1 :: (Read1 f, Read a) => Int -> ReadS (f a) | ||||
| readsPrec1 = liftReadsPrec readsPrec readList | ||||
| 
 | ||||
| -- | Lifting of the 'Show' class to unary type constructors. | ||||
| class Show1 f where | ||||
|     -- | 'showsPrec' function for an application of the type constructor | ||||
|     -- based on 'showsPrec' and 'showList' functions for the argument type. | ||||
|     liftShowsPrec :: (Int -> a -> ShowS) -> ([a] -> ShowS) -> | ||||
|         Int -> f a -> ShowS | ||||
| 
 | ||||
|     -- | 'showList' function for an application of the type constructor | ||||
|     -- based on 'showsPrec' and 'showList' functions for the argument type. | ||||
|     -- The default implementation using standard list syntax is correct | ||||
|     -- for most types. | ||||
|     liftShowList :: (Int -> a -> ShowS) -> ([a] -> ShowS) -> | ||||
|         [f a] -> ShowS | ||||
|     liftShowList sp sl = showListWith (liftShowsPrec sp sl 0) | ||||
| 
 | ||||
| #if __GLASGOW_HASKELL__ >= 708 | ||||
| deriving instance Typeable Show1 | ||||
| #endif | ||||
| 
 | ||||
| -- | Lift the standard 'showsPrec' and 'showList' functions through the | ||||
| -- type constructor. | ||||
| showsPrec1 :: (Show1 f, Show a) => Int -> f a -> ShowS | ||||
| showsPrec1 = liftShowsPrec showsPrec showList | ||||
| 
 | ||||
| -- | Lifting of the 'Eq' class to binary type constructors. | ||||
| class Eq2 f where | ||||
|     -- | Lift equality tests through the type constructor. | ||||
|     -- | ||||
|     -- The function will usually be applied to equality functions, | ||||
|     -- but the more general type ensures that the implementation uses | ||||
|     -- them to compare elements of the first container with elements of | ||||
|     -- the second. | ||||
|     liftEq2 :: (a -> b -> Bool) -> (c -> d -> Bool) -> f a c -> f b d -> Bool | ||||
| 
 | ||||
| #if __GLASGOW_HASKELL__ >= 708 | ||||
| deriving instance Typeable Eq2 | ||||
| #endif | ||||
| 
 | ||||
| -- | Lift the standard @('==')@ function through the type constructor. | ||||
| eq2 :: (Eq2 f, Eq a, Eq b) => f a b -> f a b -> Bool | ||||
| eq2 = liftEq2 (==) (==) | ||||
| 
 | ||||
| -- | Lifting of the 'Ord' class to binary type constructors. | ||||
| class (Eq2 f) => Ord2 f where | ||||
|     -- | Lift 'compare' functions through the type constructor. | ||||
|     -- | ||||
|     -- The function will usually be applied to comparison functions, | ||||
|     -- but the more general type ensures that the implementation uses | ||||
|     -- them to compare elements of the first container with elements of | ||||
|     -- the second. | ||||
|     liftCompare2 :: (a -> b -> Ordering) -> (c -> d -> Ordering) -> | ||||
|         f a c -> f b d -> Ordering | ||||
| 
 | ||||
| #if __GLASGOW_HASKELL__ >= 708 | ||||
| deriving instance Typeable Ord2 | ||||
| #endif | ||||
| 
 | ||||
| -- | Lift the standard 'compare' function through the type constructor. | ||||
| compare2 :: (Ord2 f, Ord a, Ord b) => f a b -> f a b -> Ordering | ||||
| compare2 = liftCompare2 compare compare | ||||
| 
 | ||||
| -- | Lifting of the 'Read' class to binary type constructors. | ||||
| class Read2 f where | ||||
|     -- | 'readsPrec' function for an application of the type constructor | ||||
|     -- based on 'readsPrec' and 'readList' functions for the argument types. | ||||
|     liftReadsPrec2 :: (Int -> ReadS a) -> ReadS [a] -> | ||||
|         (Int -> ReadS b) -> ReadS [b] -> Int -> ReadS (f a b) | ||||
| 
 | ||||
|     -- | 'readList' function for an application of the type constructor | ||||
|     -- based on 'readsPrec' and 'readList' functions for the argument types. | ||||
|     -- The default implementation using standard list syntax is correct | ||||
|     -- for most types. | ||||
|     liftReadList2 :: (Int -> ReadS a) -> ReadS [a] -> | ||||
|         (Int -> ReadS b) -> ReadS [b] -> ReadS [f a b] | ||||
|     liftReadList2 rp1 rl1 rp2 rl2 = | ||||
|         readListWith (liftReadsPrec2 rp1 rl1 rp2 rl2 0) | ||||
| 
 | ||||
| #if __GLASGOW_HASKELL__ >= 708 | ||||
| deriving instance Typeable Read2 | ||||
| #endif | ||||
| 
 | ||||
| -- | Lift the standard 'readsPrec' function through the type constructor. | ||||
| readsPrec2 :: (Read2 f, Read a, Read b) => Int -> ReadS (f a b) | ||||
| readsPrec2 = liftReadsPrec2 readsPrec readList readsPrec readList | ||||
| 
 | ||||
| -- | Lifting of the 'Show' class to binary type constructors. | ||||
| class Show2 f where | ||||
|     -- | 'showsPrec' function for an application of the type constructor | ||||
|     -- based on 'showsPrec' and 'showList' functions for the argument types. | ||||
|     liftShowsPrec2 :: (Int -> a -> ShowS) -> ([a] -> ShowS) -> | ||||
|         (Int -> b -> ShowS) -> ([b] -> ShowS) -> Int -> f a b -> ShowS | ||||
| 
 | ||||
|     -- | 'showList' function for an application of the type constructor | ||||
|     -- based on 'showsPrec' and 'showList' functions for the argument types. | ||||
|     -- The default implementation using standard list syntax is correct | ||||
|     -- for most types. | ||||
|     liftShowList2 :: (Int -> a -> ShowS) -> ([a] -> ShowS) -> | ||||
|         (Int -> b -> ShowS) -> ([b] -> ShowS) -> [f a b] -> ShowS | ||||
|     liftShowList2 sp1 sl1 sp2 sl2 = | ||||
|         showListWith (liftShowsPrec2 sp1 sl1 sp2 sl2 0) | ||||
| 
 | ||||
| #if __GLASGOW_HASKELL__ >= 708 | ||||
| deriving instance Typeable Show2 | ||||
| #endif | ||||
| 
 | ||||
| -- | Lift the standard 'showsPrec' function through the type constructor. | ||||
| showsPrec2 :: (Show2 f, Show a, Show b) => Int -> f a b -> ShowS | ||||
| showsPrec2 = liftShowsPrec2 showsPrec showList showsPrec showList | ||||
| 
 | ||||
| -- Instances for Prelude type constructors | ||||
| 
 | ||||
| instance Eq1 Maybe where | ||||
|     liftEq _ Nothing Nothing = True | ||||
|     liftEq _ Nothing (Just _) = False | ||||
|     liftEq _ (Just _) Nothing = False | ||||
|     liftEq eq (Just x) (Just y) = eq x y | ||||
| 
 | ||||
| instance Ord1 Maybe where | ||||
|     liftCompare _ Nothing Nothing = EQ | ||||
|     liftCompare _ Nothing (Just _) = LT | ||||
|     liftCompare _ (Just _) Nothing = GT | ||||
|     liftCompare comp (Just x) (Just y) = comp x y | ||||
| 
 | ||||
| instance Read1 Maybe where | ||||
|     liftReadsPrec rp _ d = | ||||
|          readParen False (\ r -> [(Nothing,s) | ("Nothing",s) <- lex r]) | ||||
|          `mappend` | ||||
|          readsData (readsUnaryWith rp "Just" Just) d | ||||
| 
 | ||||
| instance Show1 Maybe where | ||||
|     liftShowsPrec _ _ _ Nothing = showString "Nothing" | ||||
|     liftShowsPrec sp _ d (Just x) = showsUnaryWith sp "Just" d x | ||||
| 
 | ||||
| instance Eq1 [] where | ||||
|     liftEq _ [] [] = True | ||||
|     liftEq _ [] (_:_) = False | ||||
|     liftEq _ (_:_) [] = False | ||||
|     liftEq eq (x:xs) (y:ys) = eq x y && liftEq eq xs ys | ||||
| 
 | ||||
| instance Ord1 [] where | ||||
|     liftCompare _ [] [] = EQ | ||||
|     liftCompare _ [] (_:_) = LT | ||||
|     liftCompare _ (_:_) [] = GT | ||||
|     liftCompare comp (x:xs) (y:ys) = comp x y `mappend` liftCompare comp xs ys | ||||
| 
 | ||||
| instance Read1 [] where | ||||
|     liftReadsPrec _ rl _ = rl | ||||
| 
 | ||||
| instance Show1 [] where | ||||
|     liftShowsPrec _ sl _ = sl | ||||
| 
 | ||||
| instance Eq2 (,) where | ||||
|     liftEq2 e1 e2 (x1, y1) (x2, y2) = e1 x1 x2 && e2 y1 y2 | ||||
| 
 | ||||
| instance Ord2 (,) where | ||||
|     liftCompare2 comp1 comp2 (x1, y1) (x2, y2) = | ||||
|         comp1 x1 x2 `mappend` comp2 y1 y2 | ||||
| 
 | ||||
| instance Read2 (,) where | ||||
|     liftReadsPrec2 rp1 _ rp2 _ _ = readParen False $ \ r -> | ||||
|         [((x,y), w) | ("(",s) <- lex r, | ||||
|                       (x,t)   <- rp1 0 s, | ||||
|                       (",",u) <- lex t, | ||||
|                       (y,v)   <- rp2 0 u, | ||||
|                       (")",w) <- lex v] | ||||
| 
 | ||||
| instance Show2 (,) where | ||||
|     liftShowsPrec2 sp1 _ sp2 _ _ (x, y) = | ||||
|         showChar '(' . sp1 0 x . showChar ',' . sp2 0 y . showChar ')' | ||||
| 
 | ||||
| instance (Eq a) => Eq1 ((,) a) where | ||||
|     liftEq = liftEq2 (==) | ||||
| 
 | ||||
| instance (Ord a) => Ord1 ((,) a) where | ||||
|     liftCompare = liftCompare2 compare | ||||
| 
 | ||||
| instance (Read a) => Read1 ((,) a) where | ||||
|     liftReadsPrec = liftReadsPrec2 readsPrec readList | ||||
| 
 | ||||
| instance (Show a) => Show1 ((,) a) where | ||||
|     liftShowsPrec = liftShowsPrec2 showsPrec showList | ||||
| 
 | ||||
| instance Eq2 Either where | ||||
|     liftEq2 e1 _ (Left x) (Left y) = e1 x y | ||||
|     liftEq2 _ _ (Left _) (Right _) = False | ||||
|     liftEq2 _ _ (Right _) (Left _) = False | ||||
|     liftEq2 _ e2 (Right x) (Right y) = e2 x y | ||||
| 
 | ||||
| instance Ord2 Either where | ||||
|     liftCompare2 comp1 _ (Left x) (Left y) = comp1 x y | ||||
|     liftCompare2 _ _ (Left _) (Right _) = LT | ||||
|     liftCompare2 _ _ (Right _) (Left _) = GT | ||||
|     liftCompare2 _ comp2 (Right x) (Right y) = comp2 x y | ||||
| 
 | ||||
| instance Read2 Either where | ||||
|     liftReadsPrec2 rp1 _ rp2 _ = readsData $ | ||||
|          readsUnaryWith rp1 "Left" Left `mappend` | ||||
|          readsUnaryWith rp2 "Right" Right | ||||
| 
 | ||||
| instance Show2 Either where | ||||
|     liftShowsPrec2 sp1 _ _ _ d (Left x) = showsUnaryWith sp1 "Left" d x | ||||
|     liftShowsPrec2 _ _ sp2 _ d (Right x) = showsUnaryWith sp2 "Right" d x | ||||
| 
 | ||||
| instance (Eq a) => Eq1 (Either a) where | ||||
|     liftEq = liftEq2 (==) | ||||
| 
 | ||||
| instance (Ord a) => Ord1 (Either a) where | ||||
|     liftCompare = liftCompare2 compare | ||||
| 
 | ||||
| instance (Read a) => Read1 (Either a) where | ||||
|     liftReadsPrec = liftReadsPrec2 readsPrec readList | ||||
| 
 | ||||
| instance (Show a) => Show1 (Either a) where | ||||
|     liftShowsPrec = liftShowsPrec2 showsPrec showList | ||||
| 
 | ||||
| #if MIN_VERSION_base(4,7,0) | ||||
| instance Eq1 Proxy where | ||||
|     liftEq _ _ _ = True | ||||
| 
 | ||||
| instance Ord1 Proxy where | ||||
|     liftCompare _ _ _ = EQ | ||||
| 
 | ||||
| instance Show1 Proxy where | ||||
|     liftShowsPrec _ _ _ _ = showString "Proxy" | ||||
| 
 | ||||
| instance Read1 Proxy where | ||||
|     liftReadsPrec _ _ d = | ||||
|         readParen (d > 10) (\r -> [(Proxy, s) | ("Proxy",s) <- lex r ]) | ||||
| #endif | ||||
| 
 | ||||
| -- Instances for other functors defined in the base package | ||||
| 
 | ||||
| instance Eq1 Identity where | ||||
|     liftEq eq (Identity x) (Identity y) = eq x y | ||||
| 
 | ||||
| instance Ord1 Identity where | ||||
|     liftCompare comp (Identity x) (Identity y) = comp x y | ||||
| 
 | ||||
| instance Read1 Identity where | ||||
|     liftReadsPrec rp _ = readsData $ | ||||
|          readsUnaryWith rp "Identity" Identity | ||||
| 
 | ||||
| instance Show1 Identity where | ||||
|     liftShowsPrec sp _ d (Identity x) = showsUnaryWith sp "Identity" d x | ||||
| 
 | ||||
| instance Eq2 Const where | ||||
|     liftEq2 eq _ (Const x) (Const y) = eq x y | ||||
| 
 | ||||
| instance Ord2 Const where | ||||
|     liftCompare2 comp _ (Const x) (Const y) = comp x y | ||||
| 
 | ||||
| instance Read2 Const where | ||||
|     liftReadsPrec2 rp _ _ _ = readsData $ | ||||
|          readsUnaryWith rp "Const" Const | ||||
| 
 | ||||
| instance Show2 Const where | ||||
|     liftShowsPrec2 sp _ _ _ d (Const x) = showsUnaryWith sp "Const" d x | ||||
| 
 | ||||
| instance (Eq a) => Eq1 (Const a) where | ||||
|     liftEq = liftEq2 (==) | ||||
| instance (Ord a) => Ord1 (Const a) where | ||||
|     liftCompare = liftCompare2 compare | ||||
| instance (Read a) => Read1 (Const a) where | ||||
|     liftReadsPrec = liftReadsPrec2 readsPrec readList | ||||
| instance (Show a) => Show1 (Const a) where | ||||
|     liftShowsPrec = liftShowsPrec2 showsPrec showList | ||||
| 
 | ||||
| -- Building blocks | ||||
| 
 | ||||
| -- | @'readsData' p d@ is a parser for datatypes where each alternative | ||||
| -- begins with a data constructor.  It parses the constructor and | ||||
| -- passes it to @p@.  Parsers for various constructors can be constructed | ||||
| -- with 'readsUnary', 'readsUnary1' and 'readsBinary1', and combined with | ||||
| -- @mappend@ from the @Monoid@ class. | ||||
| readsData :: (String -> ReadS a) -> Int -> ReadS a | ||||
| readsData reader d = | ||||
|     readParen (d > 10) $ \ r -> [res | (kw,s) <- lex r, res <- reader kw s] | ||||
| 
 | ||||
| -- | @'readsUnaryWith' rp n c n'@ matches the name of a unary data constructor | ||||
| -- and then parses its argument using @rp@. | ||||
| readsUnaryWith :: (Int -> ReadS a) -> String -> (a -> t) -> String -> ReadS t | ||||
| readsUnaryWith rp name cons kw s = | ||||
|     [(cons x,t) | kw == name, (x,t) <- rp 11 s] | ||||
| 
 | ||||
| -- | @'readsBinaryWith' rp1 rp2 n c n'@ matches the name of a binary | ||||
| -- data constructor and then parses its arguments using @rp1@ and @rp2@ | ||||
| -- respectively. | ||||
| readsBinaryWith :: (Int -> ReadS a) -> (Int -> ReadS b) -> | ||||
|     String -> (a -> b -> t) -> String -> ReadS t | ||||
| readsBinaryWith rp1 rp2 name cons kw s = | ||||
|     [(cons x y,u) | kw == name, (x,t) <- rp1 11 s, (y,u) <- rp2 11 t] | ||||
| 
 | ||||
| -- | @'showsUnaryWith' sp n d x@ produces the string representation of a | ||||
| -- unary data constructor with name @n@ and argument @x@, in precedence | ||||
| -- context @d@. | ||||
| showsUnaryWith :: (Int -> a -> ShowS) -> String -> Int -> a -> ShowS | ||||
| showsUnaryWith sp name d x = showParen (d > 10) $ | ||||
|     showString name . showChar ' ' . sp 11 x | ||||
| 
 | ||||
| -- | @'showsBinaryWith' sp1 sp2 n d x y@ produces the string | ||||
| -- representation of a binary data constructor with name @n@ and arguments | ||||
| -- @x@ and @y@, in precedence context @d@. | ||||
| showsBinaryWith :: (Int -> a -> ShowS) -> (Int -> b -> ShowS) -> | ||||
|     String -> Int -> a -> b -> ShowS | ||||
| showsBinaryWith sp1 sp2 name d x y = showParen (d > 10) $ | ||||
|     showString name . showChar ' ' . sp1 11 x . showChar ' ' . sp2 11 y | ||||
| 
 | ||||
| -- Obsolete building blocks | ||||
| 
 | ||||
| -- | @'readsUnary' n c n'@ matches the name of a unary data constructor | ||||
| -- and then parses its argument using 'readsPrec'. | ||||
| {-# DEPRECATED readsUnary "Use readsUnaryWith to define liftReadsPrec" #-} | ||||
| readsUnary :: (Read a) => String -> (a -> t) -> String -> ReadS t | ||||
| readsUnary name cons kw s = | ||||
|     [(cons x,t) | kw == name, (x,t) <- readsPrec 11 s] | ||||
| 
 | ||||
| -- | @'readsUnary1' n c n'@ matches the name of a unary data constructor | ||||
| -- and then parses its argument using 'readsPrec1'. | ||||
| {-# DEPRECATED readsUnary1 "Use readsUnaryWith to define liftReadsPrec" #-} | ||||
| readsUnary1 :: (Read1 f, Read a) => String -> (f a -> t) -> String -> ReadS t | ||||
| readsUnary1 name cons kw s = | ||||
|     [(cons x,t) | kw == name, (x,t) <- readsPrec1 11 s] | ||||
| 
 | ||||
| -- | @'readsBinary1' n c n'@ matches the name of a binary data constructor | ||||
| -- and then parses its arguments using 'readsPrec1'. | ||||
| {-# DEPRECATED readsBinary1 "Use readsBinaryWith to define liftReadsPrec" #-} | ||||
| readsBinary1 :: (Read1 f, Read1 g, Read a) => | ||||
|     String -> (f a -> g a -> t) -> String -> ReadS t | ||||
| readsBinary1 name cons kw s = | ||||
|     [(cons x y,u) | kw == name, | ||||
|         (x,t) <- readsPrec1 11 s, (y,u) <- readsPrec1 11 t] | ||||
| 
 | ||||
| -- | @'showsUnary' n d x@ produces the string representation of a unary data | ||||
| -- constructor with name @n@ and argument @x@, in precedence context @d@. | ||||
| {-# DEPRECATED showsUnary "Use showsUnaryWith to define liftShowsPrec" #-} | ||||
| showsUnary :: (Show a) => String -> Int -> a -> ShowS | ||||
| showsUnary name d x = showParen (d > 10) $ | ||||
|     showString name . showChar ' ' . showsPrec 11 x | ||||
| 
 | ||||
| -- | @'showsUnary1' n d x@ produces the string representation of a unary data | ||||
| -- constructor with name @n@ and argument @x@, in precedence context @d@. | ||||
| {-# DEPRECATED showsUnary1 "Use showsUnaryWith to define liftShowsPrec" #-} | ||||
| showsUnary1 :: (Show1 f, Show a) => String -> Int -> f a -> ShowS | ||||
| showsUnary1 name d x = showParen (d > 10) $ | ||||
|     showString name . showChar ' ' . showsPrec1 11 x | ||||
| 
 | ||||
| -- | @'showsBinary1' n d x y@ produces the string representation of a binary | ||||
| -- data constructor with name @n@ and arguments @x@ and @y@, in precedence | ||||
| -- context @d@. | ||||
| {-# DEPRECATED showsBinary1 "Use showsBinaryWith to define liftShowsPrec" #-} | ||||
| showsBinary1 :: (Show1 f, Show1 g, Show a) => | ||||
|     String -> Int -> f a -> g a -> ShowS | ||||
| showsBinary1 name d x y = showParen (d > 10) $ | ||||
|     showString name . showChar ' ' . showsPrec1 11 x . | ||||
|         showChar ' ' . showsPrec1 11 y | ||||
| 
 | ||||
| {- $example | ||||
| These functions can be used to assemble 'Read' and 'Show' instances for | ||||
| new algebraic types.  For example, given the definition | ||||
| 
 | ||||
| > data T f a = Zero a | One (f a) | Two a (f a) | ||||
| 
 | ||||
| a standard 'Read1' instance may be defined as | ||||
| 
 | ||||
| > instance (Read1 f) => Read1 (T f) where | ||||
| >     liftReadsPrec rp rl = readsData $ | ||||
| >         readsUnaryWith rp "Zero" Zero `mappend` | ||||
| >         readsUnaryWith (liftReadsPrec rp rl) "One" One `mappend` | ||||
| >         readsBinaryWith rp (liftReadsPrec rp rl) "Two" Two | ||||
| 
 | ||||
| and the corresponding 'Show1' instance as | ||||
| 
 | ||||
| > instance (Show1 f) => Show1 (T f) where | ||||
| >     liftShowsPrec sp _ d (Zero x) = | ||||
| >         showsUnaryWith sp "Zero" d x | ||||
| >     liftShowsPrec sp sl d (One x) = | ||||
| >         showsUnaryWith (liftShowsPrec sp sl) "One" d x | ||||
| >     liftShowsPrec sp sl d (Two x y) = | ||||
| >         showsBinaryWith sp (liftShowsPrec sp sl) "Two" d x y | ||||
| 
 | ||||
| -} | ||||
							
								
								
									
										154
									
								
								third_party/bazel/rules_haskell/examples/transformers/legacy/pre711/Data/Functor/Compose.hs
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										154
									
								
								third_party/bazel/rules_haskell/examples/transformers/legacy/pre711/Data/Functor/Compose.hs
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,154 @@ | |||
| {-# LANGUAGE CPP #-} | ||||
| #if __GLASGOW_HASKELL__ >= 702 | ||||
| {-# LANGUAGE DeriveGeneric #-} | ||||
| {-# LANGUAGE EmptyDataDecls #-} | ||||
| {-# LANGUAGE StandaloneDeriving #-} | ||||
| {-# LANGUAGE Trustworthy #-} | ||||
| {-# LANGUAGE TypeFamilies #-} | ||||
| {-# LANGUAGE TypeOperators #-} | ||||
| #endif | ||||
| #if __GLASGOW_HASKELL__ >= 706 | ||||
| {-# LANGUAGE PolyKinds #-} | ||||
| #endif | ||||
| #if __GLASGOW_HASKELL__ >= 708 | ||||
| {-# LANGUAGE AutoDeriveTypeable #-} | ||||
| {-# LANGUAGE DataKinds #-} | ||||
| {-# LANGUAGE DeriveDataTypeable #-} | ||||
| {-# LANGUAGE FlexibleContexts #-} | ||||
| {-# LANGUAGE KindSignatures #-} | ||||
| #endif | ||||
| ----------------------------------------------------------------------------- | ||||
| -- | | ||||
| -- Module      :  Data.Functor.Compose | ||||
| -- Copyright   :  (c) Ross Paterson 2010 | ||||
| -- License     :  BSD-style (see the file LICENSE) | ||||
| -- | ||||
| -- Maintainer  :  R.Paterson@city.ac.uk | ||||
| -- Stability   :  experimental | ||||
| -- Portability :  portable | ||||
| -- | ||||
| -- Composition of functors. | ||||
| ----------------------------------------------------------------------------- | ||||
| 
 | ||||
| module Data.Functor.Compose ( | ||||
|     Compose(..), | ||||
|   ) where | ||||
| 
 | ||||
| import Data.Functor.Classes | ||||
| #if MIN_VERSION_base(4,12,0) | ||||
| import Data.Functor.Contravariant | ||||
| #endif | ||||
| 
 | ||||
| import Control.Applicative | ||||
| #if __GLASGOW_HASKELL__ >= 708 | ||||
| import Data.Data | ||||
| #endif | ||||
| import Data.Foldable (Foldable(foldMap)) | ||||
| import Data.Traversable (Traversable(traverse)) | ||||
| #if __GLASGOW_HASKELL__ >= 702 | ||||
| import GHC.Generics | ||||
| #endif | ||||
| 
 | ||||
| infixr 9 `Compose` | ||||
| 
 | ||||
| -- | Right-to-left composition of functors. | ||||
| -- The composition of applicative functors is always applicative, | ||||
| -- but the composition of monads is not always a monad. | ||||
| newtype Compose f g a = Compose { getCompose :: f (g a) } | ||||
| 
 | ||||
| #if __GLASGOW_HASKELL__ >= 702 | ||||
| deriving instance Generic (Compose f g a) | ||||
| 
 | ||||
| instance Functor f => Generic1 (Compose f g) where | ||||
|     type Rep1 (Compose f g) = | ||||
|       D1 MDCompose | ||||
|         (C1 MCCompose | ||||
|           (S1 MSCompose (f :.: Rec1 g))) | ||||
|     from1 (Compose x) = M1 (M1 (M1 (Comp1 (fmap Rec1 x)))) | ||||
|     to1 (M1 (M1 (M1 x))) = Compose (fmap unRec1 (unComp1 x)) | ||||
| 
 | ||||
| data MDCompose | ||||
| data MCCompose | ||||
| data MSCompose | ||||
| 
 | ||||
| instance Datatype MDCompose where | ||||
|     datatypeName _ = "Compose" | ||||
|     moduleName   _ = "Data.Functor.Compose" | ||||
| # if __GLASGOW_HASKELL__ >= 708 | ||||
|     isNewtype    _ = True | ||||
| # endif | ||||
| 
 | ||||
| instance Constructor MCCompose where | ||||
|     conName     _ = "Compose" | ||||
|     conIsRecord _ = True | ||||
| 
 | ||||
| instance Selector MSCompose where | ||||
|     selName _ = "getCompose" | ||||
| #endif | ||||
| 
 | ||||
| #if __GLASGOW_HASKELL__ >= 708 | ||||
| deriving instance Typeable Compose | ||||
| deriving instance (Data (f (g a)), Typeable f, Typeable g, Typeable a) | ||||
|                => Data (Compose (f :: * -> *) (g :: * -> *) (a :: *)) | ||||
| #endif | ||||
| 
 | ||||
| -- Instances of lifted Prelude classes | ||||
| 
 | ||||
| instance (Eq1 f, Eq1 g) => Eq1 (Compose f g) where | ||||
|     liftEq eq (Compose x) (Compose y) = liftEq (liftEq eq) x y | ||||
| 
 | ||||
| instance (Ord1 f, Ord1 g) => Ord1 (Compose f g) where | ||||
|     liftCompare comp (Compose x) (Compose y) = | ||||
|         liftCompare (liftCompare comp) x y | ||||
| 
 | ||||
| instance (Read1 f, Read1 g) => Read1 (Compose f g) where | ||||
|     liftReadsPrec rp rl = readsData $ | ||||
|         readsUnaryWith (liftReadsPrec rp' rl') "Compose" Compose | ||||
|       where | ||||
|         rp' = liftReadsPrec rp rl | ||||
|         rl' = liftReadList rp rl | ||||
| 
 | ||||
| instance (Show1 f, Show1 g) => Show1 (Compose f g) where | ||||
|     liftShowsPrec sp sl d (Compose x) = | ||||
|         showsUnaryWith (liftShowsPrec sp' sl') "Compose" d x | ||||
|       where | ||||
|         sp' = liftShowsPrec sp sl | ||||
|         sl' = liftShowList sp sl | ||||
| 
 | ||||
| -- Instances of Prelude classes | ||||
| 
 | ||||
| instance (Eq1 f, Eq1 g, Eq a) => Eq (Compose f g a) where | ||||
|     (==) = eq1 | ||||
| 
 | ||||
| instance (Ord1 f, Ord1 g, Ord a) => Ord (Compose f g a) where | ||||
|     compare = compare1 | ||||
| 
 | ||||
| instance (Read1 f, Read1 g, Read a) => Read (Compose f g a) where | ||||
|     readsPrec = readsPrec1 | ||||
| 
 | ||||
| instance (Show1 f, Show1 g, Show a) => Show (Compose f g a) where | ||||
|     showsPrec = showsPrec1 | ||||
| 
 | ||||
| -- Functor instances | ||||
| 
 | ||||
| instance (Functor f, Functor g) => Functor (Compose f g) where | ||||
|     fmap f (Compose x) = Compose (fmap (fmap f) x) | ||||
| 
 | ||||
| instance (Foldable f, Foldable g) => Foldable (Compose f g) where | ||||
|     foldMap f (Compose t) = foldMap (foldMap f) t | ||||
| 
 | ||||
| instance (Traversable f, Traversable g) => Traversable (Compose f g) where | ||||
|     traverse f (Compose t) = Compose <$> traverse (traverse f) t | ||||
| 
 | ||||
| instance (Applicative f, Applicative g) => Applicative (Compose f g) where | ||||
|     pure x = Compose (pure (pure x)) | ||||
|     Compose f <*> Compose x = Compose ((<*>) <$> f <*> x) | ||||
| 
 | ||||
| instance (Alternative f, Applicative g) => Alternative (Compose f g) where | ||||
|     empty = Compose empty | ||||
|     Compose x <|> Compose y = Compose (x <|> y) | ||||
| 
 | ||||
| #if MIN_VERSION_base(4,12,0) | ||||
| instance (Functor f, Contravariant g) => Contravariant (Compose f g) where | ||||
|     contramap f (Compose fga) = Compose (fmap (contramap f) fga) | ||||
| #endif | ||||
							
								
								
									
										156
									
								
								third_party/bazel/rules_haskell/examples/transformers/legacy/pre711/Data/Functor/Product.hs
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										156
									
								
								third_party/bazel/rules_haskell/examples/transformers/legacy/pre711/Data/Functor/Product.hs
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,156 @@ | |||
| {-# LANGUAGE CPP #-} | ||||
| #if __GLASGOW_HASKELL__ >= 702 | ||||
| {-# LANGUAGE DeriveGeneric #-} | ||||
| {-# LANGUAGE EmptyDataDecls #-} | ||||
| {-# LANGUAGE StandaloneDeriving #-} | ||||
| {-# LANGUAGE Trustworthy #-} | ||||
| {-# LANGUAGE TypeFamilies #-} | ||||
| {-# LANGUAGE TypeOperators #-} | ||||
| #endif | ||||
| #if __GLASGOW_HASKELL__ >= 706 | ||||
| {-# LANGUAGE PolyKinds #-} | ||||
| #endif | ||||
| #if __GLASGOW_HASKELL__ >= 708 | ||||
| {-# LANGUAGE AutoDeriveTypeable #-} | ||||
| {-# LANGUAGE DataKinds #-} | ||||
| {-# LANGUAGE DeriveDataTypeable #-} | ||||
| {-# LANGUAGE FlexibleContexts #-} | ||||
| {-# LANGUAGE KindSignatures #-} | ||||
| #endif | ||||
| ----------------------------------------------------------------------------- | ||||
| -- | | ||||
| -- Module      :  Data.Functor.Product | ||||
| -- Copyright   :  (c) Ross Paterson 2010 | ||||
| -- License     :  BSD-style (see the file LICENSE) | ||||
| -- | ||||
| -- Maintainer  :  R.Paterson@city.ac.uk | ||||
| -- Stability   :  experimental | ||||
| -- Portability :  portable | ||||
| -- | ||||
| -- Products, lifted to functors. | ||||
| ----------------------------------------------------------------------------- | ||||
| 
 | ||||
| module Data.Functor.Product ( | ||||
|     Product(..), | ||||
|   ) where | ||||
| 
 | ||||
| import Control.Applicative | ||||
| import Control.Monad (MonadPlus(..)) | ||||
| import Control.Monad.Fix (MonadFix(..)) | ||||
| #if MIN_VERSION_base(4,4,0) | ||||
| import Control.Monad.Zip (MonadZip(mzipWith)) | ||||
| #endif | ||||
| #if __GLASGOW_HASKELL__ >= 708 | ||||
| import Data.Data | ||||
| #endif | ||||
| import Data.Foldable (Foldable(foldMap)) | ||||
| import Data.Functor.Classes | ||||
| #if MIN_VERSION_base(4,12,0) | ||||
| import Data.Functor.Contravariant | ||||
| #endif | ||||
| import Data.Monoid (mappend) | ||||
| import Data.Traversable (Traversable(traverse)) | ||||
| #if __GLASGOW_HASKELL__ >= 702 | ||||
| import GHC.Generics | ||||
| #endif | ||||
| 
 | ||||
| -- | Lifted product of functors. | ||||
| data Product f g a = Pair (f a) (g a) | ||||
| 
 | ||||
| #if __GLASGOW_HASKELL__ >= 702 | ||||
| deriving instance Generic (Product f g a) | ||||
| 
 | ||||
| instance Generic1 (Product f g) where | ||||
|     type Rep1 (Product f g) = | ||||
|       D1 MDProduct | ||||
|         (C1 MCPair | ||||
|           (S1 NoSelector (Rec1 f) :*: S1 NoSelector (Rec1 g))) | ||||
|     from1 (Pair f g) = M1 (M1 (M1 (Rec1 f) :*: M1 (Rec1 g))) | ||||
|     to1 (M1 (M1 (M1 f :*: M1 g))) = Pair (unRec1 f) (unRec1 g) | ||||
| 
 | ||||
| data MDProduct | ||||
| data MCPair | ||||
| 
 | ||||
| instance Datatype MDProduct where | ||||
|     datatypeName _ = "Product" | ||||
|     moduleName   _ = "Data.Functor.Product" | ||||
| 
 | ||||
| instance Constructor MCPair where | ||||
|     conName _ = "Pair" | ||||
| #endif | ||||
| 
 | ||||
| #if __GLASGOW_HASKELL__ >= 708 | ||||
| deriving instance Typeable Product | ||||
| deriving instance (Data (f a), Data (g a), Typeable f, Typeable g, Typeable a) | ||||
|                => Data (Product (f :: * -> *) (g :: * -> *) (a :: *)) | ||||
| #endif | ||||
| 
 | ||||
| instance (Eq1 f, Eq1 g) => Eq1 (Product f g) where | ||||
|     liftEq eq (Pair x1 y1) (Pair x2 y2) = liftEq eq x1 x2 && liftEq eq y1 y2 | ||||
| 
 | ||||
| instance (Ord1 f, Ord1 g) => Ord1 (Product f g) where | ||||
|     liftCompare comp (Pair x1 y1) (Pair x2 y2) = | ||||
|         liftCompare comp x1 x2 `mappend` liftCompare comp y1 y2 | ||||
| 
 | ||||
| instance (Read1 f, Read1 g) => Read1 (Product f g) where | ||||
|     liftReadsPrec rp rl = readsData $ | ||||
|         readsBinaryWith (liftReadsPrec rp rl) (liftReadsPrec rp rl) "Pair" Pair | ||||
| 
 | ||||
| instance (Show1 f, Show1 g) => Show1 (Product f g) where | ||||
|     liftShowsPrec sp sl d (Pair x y) = | ||||
|         showsBinaryWith (liftShowsPrec sp sl) (liftShowsPrec sp sl) "Pair" d x y | ||||
| 
 | ||||
| instance (Eq1 f, Eq1 g, Eq a) => Eq (Product f g a) | ||||
|     where (==) = eq1 | ||||
| instance (Ord1 f, Ord1 g, Ord a) => Ord (Product f g a) where | ||||
|     compare = compare1 | ||||
| instance (Read1 f, Read1 g, Read a) => Read (Product f g a) where | ||||
|     readsPrec = readsPrec1 | ||||
| instance (Show1 f, Show1 g, Show a) => Show (Product f g a) where | ||||
|     showsPrec = showsPrec1 | ||||
| 
 | ||||
| instance (Functor f, Functor g) => Functor (Product f g) where | ||||
|     fmap f (Pair x y) = Pair (fmap f x) (fmap f y) | ||||
| 
 | ||||
| instance (Foldable f, Foldable g) => Foldable (Product f g) where | ||||
|     foldMap f (Pair x y) = foldMap f x `mappend` foldMap f y | ||||
| 
 | ||||
| instance (Traversable f, Traversable g) => Traversable (Product f g) where | ||||
|     traverse f (Pair x y) = Pair <$> traverse f x <*> traverse f y | ||||
| 
 | ||||
| instance (Applicative f, Applicative g) => Applicative (Product f g) where | ||||
|     pure x = Pair (pure x) (pure x) | ||||
|     Pair f g <*> Pair x y = Pair (f <*> x) (g <*> y) | ||||
| 
 | ||||
| instance (Alternative f, Alternative g) => Alternative (Product f g) where | ||||
|     empty = Pair empty empty | ||||
|     Pair x1 y1 <|> Pair x2 y2 = Pair (x1 <|> x2) (y1 <|> y2) | ||||
| 
 | ||||
| instance (Monad f, Monad g) => Monad (Product f g) where | ||||
| #if !(MIN_VERSION_base(4,8,0)) | ||||
|     return x = Pair (return x) (return x) | ||||
| #endif | ||||
|     Pair m n >>= f = Pair (m >>= fstP . f) (n >>= sndP . f) | ||||
|       where | ||||
|         fstP (Pair a _) = a | ||||
|         sndP (Pair _ b) = b | ||||
| 
 | ||||
| instance (MonadPlus f, MonadPlus g) => MonadPlus (Product f g) where | ||||
|     mzero = Pair mzero mzero | ||||
|     Pair x1 y1 `mplus` Pair x2 y2 = Pair (x1 `mplus` x2) (y1 `mplus` y2) | ||||
| 
 | ||||
| instance (MonadFix f, MonadFix g) => MonadFix (Product f g) where | ||||
|     mfix f = Pair (mfix (fstP . f)) (mfix (sndP . f)) | ||||
|       where | ||||
|         fstP (Pair a _) = a | ||||
|         sndP (Pair _ b) = b | ||||
| 
 | ||||
| #if MIN_VERSION_base(4,4,0) | ||||
| instance (MonadZip f, MonadZip g) => MonadZip (Product f g) where | ||||
|     mzipWith f (Pair x1 y1) (Pair x2 y2) = Pair (mzipWith f x1 x2) (mzipWith f y1 y2) | ||||
| #endif | ||||
| 
 | ||||
| #if MIN_VERSION_base(4,12,0) | ||||
| instance (Contravariant f, Contravariant g) => Contravariant (Product f g) where | ||||
|     contramap f (Pair a b) = Pair (contramap f a) (contramap f b) | ||||
| #endif | ||||
							
								
								
									
										136
									
								
								third_party/bazel/rules_haskell/examples/transformers/legacy/pre711/Data/Functor/Sum.hs
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										136
									
								
								third_party/bazel/rules_haskell/examples/transformers/legacy/pre711/Data/Functor/Sum.hs
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,136 @@ | |||
| {-# LANGUAGE CPP #-} | ||||
| #if __GLASGOW_HASKELL__ >= 702 | ||||
| {-# LANGUAGE DeriveGeneric #-} | ||||
| {-# LANGUAGE EmptyDataDecls #-} | ||||
| {-# LANGUAGE StandaloneDeriving #-} | ||||
| {-# LANGUAGE Trustworthy #-} | ||||
| {-# LANGUAGE TypeFamilies #-} | ||||
| {-# LANGUAGE TypeOperators #-} | ||||
| #endif | ||||
| #if __GLASGOW_HASKELL__ >= 706 | ||||
| {-# LANGUAGE PolyKinds #-} | ||||
| #endif | ||||
| #if __GLASGOW_HASKELL__ >= 708 | ||||
| {-# LANGUAGE AutoDeriveTypeable #-} | ||||
| {-# LANGUAGE DataKinds #-} | ||||
| {-# LANGUAGE DeriveDataTypeable #-} | ||||
| {-# LANGUAGE FlexibleContexts #-} | ||||
| {-# LANGUAGE KindSignatures #-} | ||||
| #endif | ||||
| ----------------------------------------------------------------------------- | ||||
| -- | | ||||
| -- Module      :  Data.Functor.Sum | ||||
| -- Copyright   :  (c) Ross Paterson 2014 | ||||
| -- License     :  BSD-style (see the file LICENSE) | ||||
| -- | ||||
| -- Maintainer  :  R.Paterson@city.ac.uk | ||||
| -- Stability   :  experimental | ||||
| -- Portability :  portable | ||||
| -- | ||||
| -- Sums, lifted to functors. | ||||
| ----------------------------------------------------------------------------- | ||||
| 
 | ||||
| module Data.Functor.Sum ( | ||||
|     Sum(..), | ||||
|   ) where | ||||
| 
 | ||||
| import Control.Applicative | ||||
| #if __GLASGOW_HASKELL__ >= 708 | ||||
| import Data.Data | ||||
| #endif | ||||
| import Data.Foldable (Foldable(foldMap)) | ||||
| import Data.Functor.Classes | ||||
| #if MIN_VERSION_base(4,12,0) | ||||
| import Data.Functor.Contravariant | ||||
| #endif | ||||
| import Data.Monoid (mappend) | ||||
| import Data.Traversable (Traversable(traverse)) | ||||
| #if __GLASGOW_HASKELL__ >= 702 | ||||
| import GHC.Generics | ||||
| #endif | ||||
| 
 | ||||
| -- | Lifted sum of functors. | ||||
| data Sum f g a = InL (f a) | InR (g a) | ||||
| 
 | ||||
| #if __GLASGOW_HASKELL__ >= 702 | ||||
| deriving instance Generic (Sum f g a) | ||||
| 
 | ||||
| instance Generic1 (Sum f g) where | ||||
|     type Rep1 (Sum f g) = | ||||
|       D1 MDSum (C1 MCInL (S1 NoSelector (Rec1 f)) | ||||
|             :+: C1 MCInR (S1 NoSelector (Rec1 g))) | ||||
|     from1 (InL f) = M1 (L1 (M1 (M1 (Rec1 f)))) | ||||
|     from1 (InR g) = M1 (R1 (M1 (M1 (Rec1 g)))) | ||||
|     to1 (M1 (L1 (M1 (M1 f)))) = InL (unRec1 f) | ||||
|     to1 (M1 (R1 (M1 (M1 g)))) = InR (unRec1 g) | ||||
| 
 | ||||
| data MDSum | ||||
| data MCInL | ||||
| data MCInR | ||||
| 
 | ||||
| instance Datatype MDSum where | ||||
|     datatypeName _ = "Sum" | ||||
|     moduleName   _ = "Data.Functor.Sum" | ||||
| 
 | ||||
| instance Constructor MCInL where | ||||
|     conName _ = "InL" | ||||
| 
 | ||||
| instance Constructor MCInR where | ||||
|     conName _ = "InR" | ||||
| #endif | ||||
| 
 | ||||
| #if __GLASGOW_HASKELL__ >= 708 | ||||
| deriving instance Typeable Sum | ||||
| deriving instance (Data (f a), Data (g a), Typeable f, Typeable g, Typeable a) | ||||
|                => Data (Sum (f :: * -> *) (g :: * -> *) (a :: *)) | ||||
| #endif | ||||
| 
 | ||||
| instance (Eq1 f, Eq1 g) => Eq1 (Sum f g) where | ||||
|     liftEq eq (InL x1) (InL x2) = liftEq eq x1 x2 | ||||
|     liftEq _ (InL _) (InR _) = False | ||||
|     liftEq _ (InR _) (InL _) = False | ||||
|     liftEq eq (InR y1) (InR y2) = liftEq eq y1 y2 | ||||
| 
 | ||||
| instance (Ord1 f, Ord1 g) => Ord1 (Sum f g) where | ||||
|     liftCompare comp (InL x1) (InL x2) = liftCompare comp x1 x2 | ||||
|     liftCompare _ (InL _) (InR _) = LT | ||||
|     liftCompare _ (InR _) (InL _) = GT | ||||
|     liftCompare comp (InR y1) (InR y2) = liftCompare comp y1 y2 | ||||
| 
 | ||||
| instance (Read1 f, Read1 g) => Read1 (Sum f g) where | ||||
|     liftReadsPrec rp rl = readsData $ | ||||
|         readsUnaryWith (liftReadsPrec rp rl) "InL" InL `mappend` | ||||
|         readsUnaryWith (liftReadsPrec rp rl) "InR" InR | ||||
| 
 | ||||
| instance (Show1 f, Show1 g) => Show1 (Sum f g) where | ||||
|     liftShowsPrec sp sl d (InL x) = | ||||
|         showsUnaryWith (liftShowsPrec sp sl) "InL" d x | ||||
|     liftShowsPrec sp sl d (InR y) = | ||||
|         showsUnaryWith (liftShowsPrec sp sl) "InR" d y | ||||
| 
 | ||||
| instance (Eq1 f, Eq1 g, Eq a) => Eq (Sum f g a) where | ||||
|     (==) = eq1 | ||||
| instance (Ord1 f, Ord1 g, Ord a) => Ord (Sum f g a) where | ||||
|     compare = compare1 | ||||
| instance (Read1 f, Read1 g, Read a) => Read (Sum f g a) where | ||||
|     readsPrec = readsPrec1 | ||||
| instance (Show1 f, Show1 g, Show a) => Show (Sum f g a) where | ||||
|     showsPrec = showsPrec1 | ||||
| 
 | ||||
| instance (Functor f, Functor g) => Functor (Sum f g) where | ||||
|     fmap f (InL x) = InL (fmap f x) | ||||
|     fmap f (InR y) = InR (fmap f y) | ||||
| 
 | ||||
| instance (Foldable f, Foldable g) => Foldable (Sum f g) where | ||||
|     foldMap f (InL x) = foldMap f x | ||||
|     foldMap f (InR y) = foldMap f y | ||||
| 
 | ||||
| instance (Traversable f, Traversable g) => Traversable (Sum f g) where | ||||
|     traverse f (InL x) = InL <$> traverse f x | ||||
|     traverse f (InR y) = InR <$> traverse f y | ||||
| 
 | ||||
| #if MIN_VERSION_base(4,12,0) | ||||
| instance (Contravariant f, Contravariant g) => Contravariant (Sum f g) where | ||||
|     contramap f (InL xs) = InL (contramap f xs) | ||||
|     contramap f (InR ys) = InR (contramap f ys) | ||||
| #endif | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue