convert 1.0.2 → 1.4.2
raw patch · 19 files changed
+712/−563 lines, 19 filesdep +ansi-wl-pprintdep +data-defaultdep +utf8-stringdep −eitherdep −mtldep −old-localedep ~basedep ~bytestringdep ~containers
Dependencies added: ansi-wl-pprint, data-default, utf8-string
Dependencies removed: either, mtl, old-locale, old-time, time
Dependency ranges changed: base, bytestring, containers, lens, template-haskell, text
Files
- convert.cabal +52/−46
- src/Data/Convert.hs +3/−2
- src/Data/Convert/Base.hs +0/−80
- src/Data/Convert/Bound.hs +0/−165
- src/Data/Convert/Class.hs +277/−0
- src/Data/Convert/Coerce.hs +8/−0
- src/Data/Convert/Errors.hs +0/−6
- src/Data/Convert/Instances.hs +11/−6
- src/Data/Convert/Instances/Base.hs +39/−2
- src/Data/Convert/Instances/ByteString.hs +13/−0
- src/Data/Convert/Instances/List.hs +18/−0
- src/Data/Convert/Instances/Map.hs +4/−9
- src/Data/Convert/Instances/Num.hs +96/−37
- src/Data/Convert/Instances/OverloadedLabels.hs +23/−0
- src/Data/Convert/Instances/Set.hs +9/−0
- src/Data/Convert/Instances/TH.hs +4/−5
- src/Data/Convert/Instances/Text.hs +72/−205
- src/Data/Convert/Instances/Tuple.hs +67/−0
- src/Text/PrettyPrint/ANSI/Leijen/Convert.hs +16/−0
convert.cabal view
@@ -1,49 +1,55 @@-name: convert-version: 1.0.2-cabal-version: >=1.10-build-type: Simple-license: Apache-2.0-license-file: LICENSE-copyright: Copyright (C) 2015 Wojciech Danilo-maintainer: Wojciech Danilo <wojciech.danilo@gmail.com>-stability: experimental-homepage: https://github.com/wdanilo/convert-bug-reports: https://github.com/wdanilo/convert/issues-synopsis: Safe and unsafe data conversion utilities with strong type-level operation. checking.-category: Data-author: Wojciech Danilo+-- This file has been generated from package.yaml by hpack version 0.20.0.+--+-- see: https://github.com/sol/hpack+--+-- hash: bca179adb32f77b4678b362b4fb860f3129554c28e15f6a7a8591877f13e17de -flag dump-splices- default: False- manual: True+name: convert+version: 1.4.2+synopsis: Safe and unsafe data conversion utilities with strong type-level operation. checking.+category: Data+stability: experimental+homepage: https://github.com/luna/convert+bug-reports: https://github.com/luna/convert/issues+author: Luna Team+maintainer: Wojciech Danilo <wojciech.danilo@luna-lang.org>+copyright: Copyright (C) 2018 Luna Team+license: Apache-2.0+license-file: LICENSE+build-type: Simple+cabal-version: >= 1.10 library- exposed-modules:- Data.Convert- Data.Convert.Base- Data.Convert.Bound- Data.Convert.Errors- Data.Convert.Instances- Data.Convert.Instances.Base- Data.Convert.Instances.Map- Data.Convert.Instances.Num- Data.Convert.Instances.Text- Data.Convert.Instances.TH- build-depends:- base >=3 && <5,- old-time >=1.1.0.3,- time >=1.1.3,- bytestring >=0.10.2,- containers >=0.5.6.2,- old-locale >=1.0.0.7,- mtl >=2.2.1,- text >=0.8,- either >=4.4.1,- template-haskell >=2.10.0.0,- lens >=4.13- default-language: Haskell2010- default-extensions: MultiParamTypeClasses UndecidableInstances- FlexibleInstances FlexibleContexts CPP DefaultSignatures- hs-source-dirs: src- ghc-options: -O2 -Wall -fno-warn-orphans-+ hs-source-dirs:+ src+ default-extensions: AllowAmbiguousTypes ApplicativeDo BangPatterns BinaryLiterals ConstraintKinds DataKinds DefaultSignatures DeriveDataTypeable DeriveFoldable DeriveFunctor DeriveGeneric DeriveTraversable DoAndIfThenElse DuplicateRecordFields EmptyDataDecls FlexibleContexts FlexibleInstances FunctionalDependencies GeneralizedNewtypeDeriving InstanceSigs LambdaCase MonadComprehensions MultiWayIf NamedWildCards NegativeLiterals NumDecimals OverloadedLabels PackageImports QuasiQuotes PatternSynonyms RankNTypes RecursiveDo ScopedTypeVariables StandaloneDeriving TemplateHaskell TupleSections TypeApplications TypeFamilies TypeFamilyDependencies TypeOperators UnicodeSyntax ViewPatterns LiberalTypeSynonyms RelaxedPolyRec+ ghc-options: -Wall -O2+ build-depends:+ ansi-wl-pprint+ , base >=4.10 && <4.12+ , bytestring+ , containers+ , data-default+ , lens+ , template-haskell+ , text+ , utf8-string+ exposed-modules:+ Data.Convert+ Data.Convert.Class+ Data.Convert.Coerce+ Data.Convert.Instances+ Data.Convert.Instances.Base+ Data.Convert.Instances.ByteString+ Data.Convert.Instances.List+ Data.Convert.Instances.Map+ Data.Convert.Instances.Num+ Data.Convert.Instances.OverloadedLabels+ Data.Convert.Instances.Set+ Data.Convert.Instances.Text+ Data.Convert.Instances.TH+ Data.Convert.Instances.Tuple+ Text.PrettyPrint.ANSI.Leijen.Convert+ other-modules:+ Paths_convert+ default-language: Haskell2010
src/Data/Convert.hs view
@@ -1,5 +1,6 @@ module Data.Convert (module X) where -import Data.Convert.Base as X-import Data.Convert.Instances ()+import Data.Convert.Class as X+import Data.Convert.Coerce as X+import Data.Convert.Instances as X
− src/Data/Convert/Base.hs
@@ -1,80 +0,0 @@-{-# LANGUAGE UndecidableInstances #-}-{-# LANGUAGE FunctionalDependencies #-}-{-# LANGUAGE ConstraintKinds #-}-{-# LANGUAGE PolyKinds #-}-{-# LANGUAGE RankNTypes #-}--{-# LANGUAGE CPP #-}-#if __GLASGOW_HASKELL__ < 710-{-# LANGUAGE OverlappingInstances #-}-#endif--module Data.Convert.Base where--import Prelude-import Control.Lens--------------------------------------------------------------------------- Conversions-------------------------------------------------------------------------class MaybeConvertible a e b | a b -> e where- tryConvert :: a -> Either e b--class MaybeConvertible' a e b | b -> a e where- tryConvert' :: a -> Either e b--class Convertible a b where- convert :: a -> b---- Maybe we should change the name to Specializable and specialize?-class Convertible' a b | b -> a where- convert' :: a -> b--type BiCastable a b = (Castable a b, Castable b a)--class Castable a b where- cast :: a -> b- default cast :: Convertible a b => a -> b- cast = convert--type IsoMaybeConvertible a e b = (MaybeConvertible a e b, MaybeConvertible b e a)-type IsoMaybeConvertible' a e b = (MaybeConvertible' a e b, MaybeConvertible' b e a)-type IsoConvertible a b = (Convertible a b , Convertible b a )-type IsoConvertible' a b = (Convertible' a b , Convertible' b a )-type IsoCastable a b = (Castable a b , Castable b a )--class ConvertibleM m n where convertM :: m t1 -> n t1-class ConvertibleM2 m n where convertM2 :: m t1 t2 -> n t1 t2-class ConvertibleM3 m n where convertM3 :: m t1 t2 t3 -> n t1 t2 t3-class ConvertibleM4 m n where convertM4 :: m t1 t2 t3 t4 -> n t1 t2 t3 t4-class ConvertibleM5 m n where convertM5 :: m t1 t2 t3 t4 t5 -> n t1 t2 t3 t4 t5---- utils--unsafeConvert :: Show e => MaybeConvertible a e b => a -> b-unsafeConvert a =- case tryConvert a of- Left e -> error $ show e- Right r -> r--casted :: IsoCastable a b => Iso' a b-casted = iso cast cast--converted :: IsoConvertible a b => Iso' a b-converted = iso convert convert---- instances---- The following instances are commented out because they are pure EVIL.--- Lets consider following situation - we've got an instance:--- instance Castable (Edge src tgt) (Edge src' tgt') where ...--- if we use it passing the same arguments it will overlap with the --- instance Castable a a --- in such way it ould be not possible to resolve by GHC!--- --- instance {-# OVERLAPPABLE #-} Castable a a where cast = id ; {-# INLINE cast #-}--- instance {-# OVERLAPPABLE #-} Convertible a a where convert = id ; {-# INLINE convert #-}--instance {-# OVERLAPPABLE #-} Convertible a b => Convertible (Maybe a) (Maybe b) where convert = fmap convert ; {-# INLINE convert #-}-
− src/Data/Convert/Bound.hs
@@ -1,165 +0,0 @@-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE NoMonomorphismRestriction #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE DeriveFunctor #-}-{-# LANGUAGE UndecidableInstances #-}-{-# LANGUAGE LambdaCase #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE ViewPatterns #-}--module Data.Convert.Bound where--import Data.Convert.Base-import Data.Typeable-import Control.Applicative-import Language.Haskell.TH hiding (Type, Safety, Safe, Unsafe)-import Data.Monoid-import GHC.TypeLits-import Prelude hiding (Bounded, maxBound, minBound)-import qualified Prelude as Prelude------- === The runtime used safe conversion ===---- TODO [wd]: We can optimize it further. Right now we are converting everything to Rational and comparing.--- It's because sometimes we are converting between types of different bounds like Char and Int8--- - neither can we safely convert Char to Int 8 nor vice versa.--- We can though make typeclasses that will find the smallest super-type for a given type pair--- and convert both values to that super-type-boundedConversion :: (Bounded b, Ord a, Convertible a Rational, Convertible (Bounds b) (Bounds Rational))- => (a -> b) -> (a -> Either BoundError b)-boundedConversion (func :: a -> b) inp = if (convert inp) `boundedBy` (convert (bounds :: Bounds b) :: Bounds Rational)- then Right $ func inp- else Left BoundError------- === Errors ===--data BoundError = BoundError deriving (Show)----- === Conversion ===--data Conversion = Conversion (Q Exp) Type Type--class Conversions a b where- conversions :: Q Exp -> a -> b -> [Conversion]---- utils--genConversion :: Conversion -> Q Dec-genConversion c@(Conversion qexp (Type name bounds) (Type name' bounds')) = do- exp <- qexp :: Q Exp- let convf name fmod = [ValD (VarP $ mkName name) (NormalB $ fmod exp) []]- return $ if bounds `isSubBound` bounds'- then InstanceD [] (AppT (AppT (ConT $ mkName "Convertible") (ConT name)) (ConT name')) $ convf "convert" id- else InstanceD [] (AppT (AppT (AppT (ConT $ mkName "MaybeConvertible") (ConT name)) (ConT $ mkName "BoundError")) (ConT name')) $ convf "tryConvert" $ AppE (VarE $ mkName "boundedConversion")---genConversions :: [Conversion] -> Q [Dec]-genConversions = mapM genConversion---- instances--instance Conversions [Type] [Type] where conversions f a b = Conversion f <$> a <*> b-instance Conversions Type [Type] where conversions f a b = Conversion f a <$> b-instance Conversions [Type] Type where conversions f a b = flip (Conversion f) b <$> a-instance Conversions Type Type where conversions f a b = [Conversion f a b]--instance Show Conversion where- show (Conversion _ a b) = "Conversion " -- <> " " <> name a <> " " <> name b------- === Type ===--data Type = Type { name :: Name- , tbounds :: (Bounds Integer)- } deriving (Show, Eq)------ === Layout ===-data Layout = IntLayout Sign Integer- | InfiniteLayout- deriving (Show, Eq)--data Sign = Signed- | Unsigned- deriving (Show, Eq)--layoutBounds :: Layout -> Bounds Integer-layoutBounds = \case- InfiniteLayout -> infiniteBounds- IntLayout s i -> Bounds (Value (- base)) (Value $ base - 1)- where base = case s of- Signed -> 2 ^ (i - 1)- Unsigned -> 2 ^ i------ === Value ===--data Value a = MinusInfinity- | Value a- | Infinity- deriving (Show, Functor, Eq)---- instances--instance Num a => Num (Value a) where- fromInteger = Value . fromInteger--instance Convertible a b => Convertible (Value a) (Value b) where- convert (Value a) = Value $ convert a--instance Ord a => Ord (Value a) where- compare MinusInfinity MinusInfinity = EQ- compare MinusInfinity a = LT- compare a MinusInfinity = GT- compare Infinity Infinity = EQ- compare Infinity a = GT- compare a Infinity = LT- compare (Value a) (Value a') = compare a a'------- === Bounds ===--data Bounds a = Bounds (Value a) (Value a) deriving (Show, Functor, Eq)--class Bounded a where- bounds :: Bounds a---- utils--infiniteBounds :: Bounds a-infiniteBounds = Bounds MinusInfinity Infinity--isSubBound :: Ord a => Bounds a -> Bounds a -> Bool-isSubBound (Bounds min max) (Bounds min' max') = min >= min' && max <= max'--boundedBy :: Ord a => a -> Bounds a -> Bool-boundedBy (Value -> a) (Bounds min max) = a >= min && a <= max---- instances-instance {-# OVERLAPPABLE #-} Convertible a b => Convertible (Bounds a) (Bounds b) where- convert (Bounds a b) = Bounds (convert a) (convert b)--instance {-# OVERLAPPABLE #-} (Prelude.Bounded a)- => Bounded a where- bounds = Bounds (Value Prelude.minBound) (Value Prelude.maxBound)--instance {-# OVERLAPPABLE #-} Bounded Float where bounds = infiniteBounds-instance {-# OVERLAPPABLE #-} Bounded Double where bounds = infiniteBounds-instance {-# OVERLAPPABLE #-} Bounded Rational where bounds = infiniteBounds-instance {-# OVERLAPPABLE #-} Bounded Integer where bounds = infiniteBounds
+ src/Data/Convert/Class.hs view
@@ -0,0 +1,277 @@+{-# LANGUAGE UndecidableInstances #-}+{-# LANGUAGE FunctionalDependencies #-}+{-# LANGUAGE ConstraintKinds #-}+{-# LANGUAGE PolyKinds #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE AllowAmbiguousTypes #-}+{-# LANGUAGE TemplateHaskell #-}++module Data.Convert.Class where++import Prelude+import Control.Lens+import GHC.TypeLits+import Data.Default++-- TODO[WD]: file GHC Bug:+-- data A a = A a+-- data B a = B a deriving (Functor)+-- data C = C+--+-- instance Convertible1 A B+-- instance Convertible (A a) (B a)+--+-- test :: A a -> B a' -- WRONG CONSTRAINT INFERRED HERE! FILE A BUG+-- test = convert'+++--------------------------+-- === Convertibles === --+--------------------------++-- === Distinct types conversion === --++-- | Convertible allows for conversion between two compatible types.+-- When trying to convert between the same types, compile time error is reported in order to help tracking not needed usages.+-- If you want to enable conversion between the same types, use `convert'` instead.+class Convertible t t' where convert :: t -> t'+class Convertible1 t t' where convert1 :: forall s1. t s1 -> t' s1+class Convertible2 t t' where convert2 :: forall s1 s2. t s1 s2 -> t' s1 s2+class Convertible3 t t' where convert3 :: forall s1 s2 s3. t s1 s2 s3 -> t' s1 s2 s3+class Convertible4 t t' where convert4 :: forall s1 s2 s3 s4. t s1 s2 s3 s4 -> t' s1 s2 s3 s4+class Convertible5 t t' where convert5 :: forall s1 s2 s3 s4 s5. t s1 s2 s3 s4 s5 -> t' s1 s2 s3 s4 s5++-- | We cannot use OVERLAPPABLE instances here. Let's consider following instance:+-- instance (s ~ s', t ~ t') => Convertible (Symbol s t) (Symbol2 s' t') where ...+-- By writing it we indicate that during conversion from Symbol to Symbol2 the appropriate variables should be matched.+-- If the following instances would be declared as OVERLAPPABLE, it will clash with the instance `Convertible (t a) (t' a)`.+-- In other words, if user defines any conversion between type `X a` and `Y b`, we disable automatic lifting to `ConvertibleN`.+-- TODO[WD]: File GHC proposal to choose more specific incoherent instance+instance {-# OVERLAPPABLE #-} (Convertible a a', Functor t) => Convertible (t (a :: *)) (t a') where convert = fmap convert ; {-# INLINE convert #-}+instance {-# INCOHERENT #-} (Convertible1 t t', Convertible' a a', Functor t') => Convertible (t (a :: *)) (t' a') where convert = fmap convert' . convert1 ; {-# INLINE convert #-}+instance {-# INCOHERENT #-} (Convertible1 t t') => Convertible (t (a :: *)) (t' a ) where convert = convert1 ; {-# INLINE convert #-}++instance {-# OVERLAPPABLE #-} Convertible2 t t' => Convertible1 (t a) (t' a) where convert1 = convert2 ; {-# INLINE convert1 #-}+instance {-# OVERLAPPABLE #-} Convertible3 t t' => Convertible2 (t a) (t' a) where convert2 = convert3 ; {-# INLINE convert2 #-}+instance {-# OVERLAPPABLE #-} Convertible4 t t' => Convertible3 (t a) (t' a) where convert3 = convert4 ; {-# INLINE convert3 #-}+instance {-# OVERLAPPABLE #-} Convertible5 t t' => Convertible4 (t a) (t' a) where convert4 = convert5 ; {-# INLINE convert4 #-}+++-- === Identity conversion errors === --++type IdConversionErr (t :: k) = 'Text "Conversion of the same type (`"+ ':<>: 'ShowType t+ ':<>: 'Text "`) is disabled by default. Please use convert' if you want to enable it."+instance TypeError (IdConversionErr t) => Convertible t t where convert = id ; {-# INLINE convert #-}+instance TypeError (IdConversionErr t) => Convertible1 t t where convert1 = id ; {-# INLINE convert1 #-}+instance TypeError (IdConversionErr t) => Convertible2 t t where convert2 = id ; {-# INLINE convert2 #-}+instance TypeError (IdConversionErr t) => Convertible3 t t where convert3 = id ; {-# INLINE convert3 #-}+instance TypeError (IdConversionErr t) => Convertible4 t t where convert4 = id ; {-# INLINE convert4 #-}+instance TypeError (IdConversionErr t) => Convertible5 t t where convert5 = id ; {-# INLINE convert5 #-}+++-- === Utils === --++convertTo :: forall t' t. Convertible t t' => t -> t'+convertTo1 :: forall t' t. Convertible1 t t' => forall s1. t s1 -> t' s1+convertTo2 :: forall t' t. Convertible2 t t' => forall s1 s2. t s1 s2 -> t' s1 s2+convertTo3 :: forall t' t. Convertible3 t t' => forall s1 s2 s3. t s1 s2 s3 -> t' s1 s2 s3+convertTo4 :: forall t' t. Convertible4 t t' => forall s1 s2 s3 s4. t s1 s2 s3 s4 -> t' s1 s2 s3 s4+convertTo5 :: forall t' t. Convertible5 t t' => forall s1 s2 s3 s4 s5. t s1 s2 s3 s4 s5 -> t' s1 s2 s3 s4 s5+convertTo = convert ; {-# INLINE convertTo #-}+convertTo1 = convert1 ; {-# INLINE convertTo1 #-}+convertTo2 = convert2 ; {-# INLINE convertTo2 #-}+convertTo3 = convert3 ; {-# INLINE convertTo3 #-}+convertTo4 = convert4 ; {-# INLINE convertTo4 #-}+convertTo5 = convert5 ; {-# INLINE convertTo5 #-}+++-- === Conversion allowing the same types === --++class Convertible' t t' where convert' :: t -> t'+class Convertible1' t t' where convert1' :: forall s1. t s1 -> t' s1+class Convertible2' t t' where convert2' :: forall s1 s2. t s1 s2 -> t' s1 s2+class Convertible3' t t' where convert3' :: forall s1 s2 s3. t s1 s2 s3 -> t' s1 s2 s3+class Convertible4' t t' where convert4' :: forall s1 s2 s3 s4. t s1 s2 s3 s4 -> t' s1 s2 s3 s4+class Convertible5' t t' where convert5' :: forall s1 s2 s3 s4 s5. t s1 s2 s3 s4 s5 -> t' s1 s2 s3 s4 s5++instance {-# OVERLAPPABLE #-} Convertible' t t where convert' = id ; {-# INLINE convert' #-}+instance {-# OVERLAPPABLE #-} Convertible1' t t where convert1' = id ; {-# INLINE convert1' #-}+instance {-# OVERLAPPABLE #-} Convertible2' t t where convert2' = id ; {-# INLINE convert2' #-}+instance {-# OVERLAPPABLE #-} Convertible3' t t where convert3' = id ; {-# INLINE convert3' #-}+instance {-# OVERLAPPABLE #-} Convertible4' t t where convert4' = id ; {-# INLINE convert4' #-}+instance {-# OVERLAPPABLE #-} Convertible5' t t where convert5' = id ; {-# INLINE convert5' #-}+instance {-# OVERLAPPABLE #-} Convertible t t' => Convertible' t t' where convert' = convert ; {-# INLINE convert' #-}+instance {-# OVERLAPPABLE #-} Convertible1 t t' => Convertible1' t t' where convert1' = convert1 ; {-# INLINE convert1' #-}+instance {-# OVERLAPPABLE #-} Convertible2 t t' => Convertible2' t t' where convert2' = convert2 ; {-# INLINE convert2' #-}+instance {-# OVERLAPPABLE #-} Convertible3 t t' => Convertible3' t t' where convert3' = convert3 ; {-# INLINE convert3' #-}+instance {-# OVERLAPPABLE #-} Convertible4 t t' => Convertible4' t t' where convert4' = convert4 ; {-# INLINE convert4' #-}+instance {-# OVERLAPPABLE #-} Convertible5 t t' => Convertible5' t t' where convert5' = convert5 ; {-# INLINE convert5' #-}++convertTo' :: forall t' t. Convertible' t t' => t -> t'+convertTo1' :: forall t' t. Convertible1' t t' => forall s1. t s1 -> t' s1+convertTo2' :: forall t' t. Convertible2' t t' => forall s1 s2. t s1 s2 -> t' s1 s2+convertTo3' :: forall t' t. Convertible3' t t' => forall s1 s2 s3. t s1 s2 s3 -> t' s1 s2 s3+convertTo4' :: forall t' t. Convertible4' t t' => forall s1 s2 s3 s4. t s1 s2 s3 s4 -> t' s1 s2 s3 s4+convertTo5' :: forall t' t. Convertible5' t t' => forall s1 s2 s3 s4 s5. t s1 s2 s3 s4 s5 -> t' s1 s2 s3 s4 s5+convertTo' = convert' ; {-# INLINE convertTo' #-}+convertTo1' = convert1' ; {-# INLINE convertTo1' #-}+convertTo2' = convert2' ; {-# INLINE convertTo2' #-}+convertTo3' = convert3' ; {-# INLINE convertTo3' #-}+convertTo4' = convert4' ; {-# INLINE convertTo4' #-}+convertTo5' = convert5' ; {-# INLINE convertTo5' #-}++++----------------------------------+-- === Partial convertibles === --+----------------------------------++-- === Errors === --++data SimpleConversionError = SimpleConversionError deriving (Show)+instance Default SimpleConversionError where def = SimpleConversionError ; {-# INLINE def #-}+++-- === Classes === --++-- | PartialConvertible allows conversions that could fail with `ConversionError`.+class PartialConvertible t t' where+ type family ConversionError t t'+ convertAssert :: t -> Maybe (ConversionError t t')+ unsafeConvert :: t -> t'++defConvertAssert :: Default e => (a -> Bool) -> a -> Maybe e+defConvertAssert f = \s -> if f s then Just def else Nothing++unsafeConvertTo :: forall t' t. PartialConvertible t t' => t -> t'+unsafeConvertTo = unsafeConvert ; {-# INLINE unsafeConvertTo #-}++convertAssertTo :: forall t' t. PartialConvertible t t' => t -> Maybe (ConversionError t t')+convertAssertTo = convertAssert @t @t' ; {-# INLINE convertAssertTo #-}++maybeConvert :: forall t t'. PartialConvertible t t' => t -> Maybe t'+maybeConvert t = const (unsafeConvert t) <$> convertAssertTo @t' t ; {-# INLINE maybeConvert #-}++tryConvert :: forall t t'. PartialConvertible t t' => t -> Either (ConversionError t t') t'+tryConvert t = maybe (Right $ unsafeConvert t) Left $ convertAssertTo @t' t ; {-# INLINE tryConvert #-}++++-----------------------------+-- === Bi-convertibles === --+-----------------------------++type BiConvertible t t' = (Convertible t t', Convertible t' t)+type BiConvertible1 t t' = (Convertible1 t t', Convertible1 t' t)+type BiConvertible2 t t' = (Convertible2 t t', Convertible2 t' t)+type BiConvertible3 t t' = (Convertible3 t t', Convertible3 t' t)+type BiConvertible4 t t' = (Convertible4 t t', Convertible4 t' t)+type BiConvertible5 t t' = (Convertible5 t t', Convertible5 t' t)++type BiConvertible' t t' = (Convertible' t t', Convertible' t' t)+type BiConvertible1' t t' = (Convertible1' t t', Convertible1' t' t)+type BiConvertible2' t t' = (Convertible2' t t', Convertible2' t' t)+type BiConvertible3' t t' = (Convertible3' t t', Convertible3' t' t)+type BiConvertible4' t t' = (Convertible4' t t', Convertible4' t' t)+type BiConvertible5' t t' = (Convertible5' t t', Convertible5' t' t)++type BiPartialConvertible t t' = (PartialConvertible t t', PartialConvertible t t')++converted :: BiConvertible t t' => Iso' t t'+converted1 :: BiConvertible1 t t' => forall s1. Iso' (t s1) (t' s1)+converted2 :: BiConvertible2 t t' => forall s1 s2. Iso' (t s1 s2) (t' s1 s2)+converted3 :: BiConvertible3 t t' => forall s1 s2 s3. Iso' (t s1 s2 s3) (t' s1 s2 s3)+converted4 :: BiConvertible4 t t' => forall s1 s2 s3 s4. Iso' (t s1 s2 s3 s4) (t' s1 s2 s3 s4)+converted5 :: BiConvertible5 t t' => forall s1 s2 s3 s4 s5. Iso' (t s1 s2 s3 s4 s5) (t' s1 s2 s3 s4 s5)+converted' :: BiConvertible' t t' => Iso' t t'+converted1' :: BiConvertible1' t t' => forall s1. Iso' (t s1) (t' s1)+converted2' :: BiConvertible2' t t' => forall s1 s2. Iso' (t s1 s2) (t' s1 s2)+converted3' :: BiConvertible3' t t' => forall s1 s2 s3. Iso' (t s1 s2 s3) (t' s1 s2 s3)+converted4' :: BiConvertible4' t t' => forall s1 s2 s3 s4. Iso' (t s1 s2 s3 s4) (t' s1 s2 s3 s4)+converted5' :: BiConvertible5' t t' => forall s1 s2 s3 s4 s5. Iso' (t s1 s2 s3 s4 s5) (t' s1 s2 s3 s4 s5)+converted = iso convert convert ; {-# INLINE converted #-}+converted1 = iso convert1 convert1 ; {-# INLINE converted1 #-}+converted2 = iso convert2 convert2 ; {-# INLINE converted2 #-}+converted3 = iso convert3 convert3 ; {-# INLINE converted3 #-}+converted4 = iso convert4 convert4 ; {-# INLINE converted4 #-}+converted5 = iso convert5 convert5 ; {-# INLINE converted5 #-}+converted' = iso convert' convert' ; {-# INLINE converted' #-}+converted1' = iso convert1' convert1' ; {-# INLINE converted1' #-}+converted2' = iso convert2' convert2' ; {-# INLINE converted2' #-}+converted3' = iso convert3' convert3' ; {-# INLINE converted3' #-}+converted4' = iso convert4' convert4' ; {-# INLINE converted4' #-}+converted5' = iso convert5' convert5' ; {-# INLINE converted5' #-}++convertedTo :: BiConvertible t' t => Iso' t t'+convertedTo1 :: BiConvertible1 t' t => forall s1. Iso' (t s1) (t' s1)+convertedTo2 :: BiConvertible2 t' t => forall s1 s2. Iso' (t s1 s2) (t' s1 s2)+convertedTo3 :: BiConvertible3 t' t => forall s1 s2 s3. Iso' (t s1 s2 s3) (t' s1 s2 s3)+convertedTo4 :: BiConvertible4 t' t => forall s1 s2 s3 s4. Iso' (t s1 s2 s3 s4) (t' s1 s2 s3 s4)+convertedTo5 :: BiConvertible5 t' t => forall s1 s2 s3 s4 s5. Iso' (t s1 s2 s3 s4 s5) (t' s1 s2 s3 s4 s5)+convertedTo' :: BiConvertible' t' t => Iso' t t'+convertedTo1' :: BiConvertible1' t' t => forall s1. Iso' (t s1) (t' s1)+convertedTo2' :: BiConvertible2' t' t => forall s1 s2. Iso' (t s1 s2) (t' s1 s2)+convertedTo3' :: BiConvertible3' t' t => forall s1 s2 s3. Iso' (t s1 s2 s3) (t' s1 s2 s3)+convertedTo4' :: BiConvertible4' t' t => forall s1 s2 s3 s4. Iso' (t s1 s2 s3 s4) (t' s1 s2 s3 s4)+convertedTo5' :: BiConvertible5' t' t => forall s1 s2 s3 s4 s5. Iso' (t s1 s2 s3 s4 s5) (t' s1 s2 s3 s4 s5)+convertedTo = converted ; {-# INLINE convertedTo #-}+convertedTo1 = converted1 ; {-# INLINE convertedTo1 #-}+convertedTo2 = converted2 ; {-# INLINE convertedTo2 #-}+convertedTo3 = converted3 ; {-# INLINE convertedTo3 #-}+convertedTo4 = converted4 ; {-# INLINE convertedTo4 #-}+convertedTo5 = converted5 ; {-# INLINE convertedTo5 #-}+convertedTo' = converted' ; {-# INLINE convertedTo' #-}+convertedTo1' = converted1' ; {-# INLINE convertedTo1' #-}+convertedTo2' = converted2' ; {-# INLINE convertedTo2' #-}+convertedTo3' = converted3' ; {-# INLINE convertedTo3' #-}+convertedTo4' = converted4' ; {-# INLINE convertedTo4' #-}+convertedTo5' = converted5' ; {-# INLINE convertedTo5' #-}+++-- === ConvertibleVia === --++type ConvertibleVia t p t' = (Convertible t p, Convertible p t')+type ConvertibleVia1 t p t' = (Convertible1 t p, Convertible1 p t')+type ConvertibleVia2 t p t' = (Convertible2 t p, Convertible2 p t')+type ConvertibleVia3 t p t' = (Convertible3 t p, Convertible3 p t')+type ConvertibleVia4 t p t' = (Convertible4 t p, Convertible4 p t')+type ConvertibleVia5 t p t' = (Convertible5 t p, Convertible5 p t')++convertVia :: forall p t t'. ConvertibleVia t p t' => t -> t'+convertVia1 :: forall p t t'. ConvertibleVia1 t p t' => forall s1. t s1 -> t' s1+convertVia2 :: forall p t t'. ConvertibleVia2 t p t' => forall s1 s2. t s1 s2 -> t' s1 s2+convertVia3 :: forall p t t'. ConvertibleVia3 t p t' => forall s1 s2 s3. t s1 s2 s3 -> t' s1 s2 s3+convertVia4 :: forall p t t'. ConvertibleVia4 t p t' => forall s1 s2 s3 s4. t s1 s2 s3 s4 -> t' s1 s2 s3 s4+convertVia5 :: forall p t t'. ConvertibleVia5 t p t' => forall s1 s2 s3 s4 s5. t s1 s2 s3 s4 s5 -> t' s1 s2 s3 s4 s5+convertVia = convert . convertTo @p ; {-# INLINE convertVia #-}+convertVia1 = convert1 . convertTo1 @p ; {-# INLINE convertVia1 #-}+convertVia2 = convert2 . convertTo2 @p ; {-# INLINE convertVia2 #-}+convertVia3 = convert3 . convertTo3 @p ; {-# INLINE convertVia3 #-}+convertVia4 = convert4 . convertTo4 @p ; {-# INLINE convertVia4 #-}+convertVia5 = convert5 . convertTo5 @p ; {-# INLINE convertVia5 #-}++type ConvertibleVia' t p t' = (Convertible' t p, Convertible' p t')+type ConvertibleVia1' t p t' = (Convertible1' t p, Convertible1' p t')+type ConvertibleVia2' t p t' = (Convertible2' t p, Convertible2' p t')+type ConvertibleVia3' t p t' = (Convertible3' t p, Convertible3' p t')+type ConvertibleVia4' t p t' = (Convertible4' t p, Convertible4' p t')+type ConvertibleVia5' t p t' = (Convertible5' t p, Convertible5' p t')++convertVia' :: forall p t t'. ConvertibleVia' t p t' => t -> t'+convertVia1' :: forall p t t'. ConvertibleVia1' t p t' => forall s1. t s1 -> t' s1+convertVia2' :: forall p t t'. ConvertibleVia2' t p t' => forall s1 s2. t s1 s2 -> t' s1 s2+convertVia3' :: forall p t t'. ConvertibleVia3' t p t' => forall s1 s2 s3. t s1 s2 s3 -> t' s1 s2 s3+convertVia4' :: forall p t t'. ConvertibleVia4' t p t' => forall s1 s2 s3 s4. t s1 s2 s3 s4 -> t' s1 s2 s3 s4+convertVia5' :: forall p t t'. ConvertibleVia5' t p t' => forall s1 s2 s3 s4 s5. t s1 s2 s3 s4 s5 -> t' s1 s2 s3 s4 s5+convertVia' = convert' . convertTo' @p ; {-# INLINE convertVia' #-}+convertVia1' = convert1' . convertTo1' @p ; {-# INLINE convertVia1' #-}+convertVia2' = convert2' . convertTo2' @p ; {-# INLINE convertVia2' #-}+convertVia3' = convert3' . convertTo3' @p ; {-# INLINE convertVia3' #-}+convertVia4' = convert4' . convertTo4' @p ; {-# INLINE convertVia4' #-}+convertVia5' = convert5' . convertTo5' @p ; {-# INLINE convertVia5' #-}++type PartialConvertibleVia t p t' = (PartialConvertible t p, PartialConvertible p t')+unsafeConvertVia :: forall p t t'. PartialConvertibleVia t p t' => t -> t'+unsafeConvertVia = unsafeConvert . unsafeConvertTo @p ; {-# INLINE unsafeConvertVia #-}
+ src/Data/Convert/Coerce.hs view
@@ -0,0 +1,8 @@+module Data.Convert.Coerce (module Data.Convert.Coerce, module X) where++import Control.Lens (Iso, iso)+import Unsafe.Coerce (unsafeCoerce)+import Control.Lens.Iso as X (coerced)++unsafeCoerced :: Iso s t a b+unsafeCoerced = iso unsafeCoerce unsafeCoerce ; {-# INLINE unsafeCoerced #-}
− src/Data/Convert/Errors.hs
@@ -1,6 +0,0 @@-module Data.Convert.Errors where--import Prelude-import Data.Typeable--data TypeMismatch = TypeMismatch TypeRep TypeRep deriving (Show)
src/Data/Convert/Instances.hs view
@@ -1,7 +1,12 @@-module Data.Convert.Instances () where+module Data.Convert.Instances (module X) where -import Data.Convert.Instances.Base ()-import Data.Convert.Instances.Map ()-import Data.Convert.Instances.Num ()-import Data.Convert.Instances.Text ()-import Data.Convert.Instances.TH ()+import Data.Convert.Instances.Text as X+import Data.Convert.Instances.Base as X+import Data.Convert.Instances.ByteString ()+import Data.Convert.Instances.List ()+import Data.Convert.Instances.Map ()+import Data.Convert.Instances.Num ()+import Data.Convert.Instances.OverloadedLabels ()+import Data.Convert.Instances.Set ()+import Data.Convert.Instances.TH ()+import Data.Convert.Instances.Tuple ()
src/Data/Convert/Instances/Base.hs view
@@ -1,5 +1,42 @@ module Data.Convert.Instances.Base where -import Data.Convert.Base+import Prelude+import Data.Convert.Class+import Control.Lens -instance Castable a a' => Castable [a] [a'] where cast = fmap cast ; {-# INLINE cast #-}++-- === Tuples === --++instance Convertible () [t] where convert _ = [] ; {-# INLINE convert #-}+instance Convertible (t,t) [t] where convert (t1,t2) = [t1,t2] ; {-# INLINE convert #-}+instance Convertible (t,t,t) [t] where convert (t1,t2,t3) = [t1,t2,t3] ; {-# INLINE convert #-}+instance Convertible (t,t,t,t) [t] where convert (t1,t2,t3,t4) = [t1,t2,t3,t4] ; {-# INLINE convert #-}+instance Convertible (t,t,t,t,t) [t] where convert (t1,t2,t3,t4,t5) = [t1,t2,t3,t4,t5] ; {-# INLINE convert #-}+instance Convertible (t,t,t,t,t,t) [t] where convert (t1,t2,t3,t4,t5,t6) = [t1,t2,t3,t4,t5,t6] ; {-# INLINE convert #-}+instance Convertible (t,t,t,t,t,t,t) [t] where convert (t1,t2,t3,t4,t5,t6,t7) = [t1,t2,t3,t4,t5,t6,t7] ; {-# INLINE convert #-}+instance Convertible (t,t,t,t,t,t,t,t) [t] where convert (t1,t2,t3,t4,t5,t6,t7,t8) = [t1,t2,t3,t4,t5,t6,t7,t8] ; {-# INLINE convert #-}+instance Convertible (t,t,t,t,t,t,t,t,t) [t] where convert (t1,t2,t3,t4,t5,t6,t7,t8,t9) = [t1,t2,t3,t4,t5,t6,t7,t8,t9] ; {-# INLINE convert #-}+++-- === Boool === --++-- TODO: TH vvv+type ToBool a = Convertible a Bool+type ToBool' a = Convertible' a Bool+type FromBool a = Convertible Bool a+type FromBool' a = Convertible' Bool a+type IsBool a = (ToBool a, FromBool a)+type IsBool' a = (ToBool' a, FromBool' a)++toBool :: ToBool a => a -> Bool+toBool' :: ToBool' a => a -> Bool+fromBool :: FromBool a => Bool -> a+fromBool' :: FromBool' a => Bool -> a+asBool :: IsBool a => Iso' a Bool+asBool' :: IsBool' a => Iso' a Bool+toBool = convert ; {-# INLINE toBool #-}+toBool' = convert' ; {-# INLINE toBool' #-}+fromBool = convert ; {-# INLINE fromBool #-}+fromBool' = convert' ; {-# INLINE fromBool' #-}+asBool = iso toBool fromBool ; {-# INLINE asBool #-}+asBool' = iso toBool' fromBool' ; {-# INLINE asBool' #-}
+ src/Data/Convert/Instances/ByteString.hs view
@@ -0,0 +1,13 @@+module Data.Convert.Instances.ByteString where++import qualified Data.ByteString as Strict+import qualified Data.ByteString.Lazy as Lazy+import qualified Data.ByteString.UTF8 as UTF8+import Data.Convert.Class++instance Convertible Strict.ByteString String where convert = UTF8.toString ; {-# INLINE convert #-}+instance Convertible String Strict.ByteString where convert = UTF8.fromString ; {-# INLINE convert #-}+instance Convertible Lazy.ByteString Strict.ByteString where convert = Lazy.toStrict ; {-# INLINE convert #-}+instance Convertible Strict.ByteString Lazy.ByteString where convert = Lazy.fromStrict ; {-# INLINE convert #-}+instance Convertible Lazy.ByteString String where convert = convertVia @Strict.ByteString ; {-# INLINE convert #-}+instance Convertible String Lazy.ByteString where convert = convertVia @Strict.ByteString ; {-# INLINE convert #-}
+ src/Data/Convert/Instances/List.hs view
@@ -0,0 +1,18 @@+module Data.Convert.Instances.List where++import Prelude+import Data.Convert.Class+import Data.List.NonEmpty+import Data.Default++instance {-# OVERLAPPABLE #-} Convertible a [a] where convert = pure ; {-# INLINE convert #-}++instance Convertible' a b => Convertible (NonEmpty a) [b] where+ convert (a:|as) = convert' a : fmap convert' as++instance Convertible' a b => PartialConvertible [a] (NonEmpty b) where+ type ConversionError [a] (NonEmpty b) = SimpleConversionError+ convertAssert = \case+ [] -> Just SimpleConversionError+ _ -> Nothing+ unsafeConvert (a:as) = convert' a :| fmap convert' as ; {-# INLINE unsafeConvert #-}
src/Data/Convert/Instances/Map.hs view
@@ -1,14 +1,9 @@-module Data.Convert.Instances.Map()-where+module Data.Convert.Instances.Map where import Prelude-import Data.Convert.Base+import Data.Convert.Class import qualified Data.Map as Map --instance Ord k => Convertible [(k, a)] (Map.Map k a) where- convert = Map.fromList--instance Convertible (Map.Map k a) [(k, a)] where- convert = Map.toList+instance Ord k => Convertible [(k, a)] (Map.Map k a) where convert = Map.fromList ; {-# INLINE convert #-}+instance Convertible (Map.Map k a) [(k, a)] where convert = Map.toList ; {-# INLINE convert #-}
src/Data/Convert/Instances/Num.hs view
@@ -2,67 +2,126 @@ {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE AllowAmbiguousTypes #-} module Data.Convert.Instances.Num where import Prelude -import Data.Convert.Bound-import Data.Convert.Base+import Data.Convert.Class import Data.Monoid import qualified Data.ByteString as BS import GHC.Int import Data.Word import Data.Bits (shiftR) -intTypes = [ Type ''Int $ layoutBounds $ IntLayout Signed 30 -- according to: https://hackage.haskell.org/package/base-4.8.0.0/docs/Data-Int.html#t:Int- , Type ''Integer $ layoutBounds $ InfiniteLayout- , Type ''Int8 $ layoutBounds $ IntLayout Signed 8- , Type ''Int16 $ layoutBounds $ IntLayout Signed 16- , Type ''Int32 $ layoutBounds $ IntLayout Signed 32- , Type ''Int64 $ layoutBounds $ IntLayout Signed 64- ]+import Data.Coerce+import Unsafe.Coerce+import Language.Haskell.TH+import Data.Default+import Control.Lens+import Data.Proxy+import Foreign.C.Types (CSize) -wordTypes = [ Type ''Word $ layoutBounds $ IntLayout Signed 30 -- according to: https://hackage.haskell.org/package/base-4.8.0.0/docs/Data-Int.html#t:Int- , Type ''Word8 $ layoutBounds $ IntLayout Signed 8- , Type ''Word16 $ layoutBounds $ IntLayout Signed 16- , Type ''Word32 $ layoutBounds $ IntLayout Signed 32- , Type ''Word64 $ layoutBounds $ IntLayout Signed 64++-- === Errors === --++data BoundError = BoundError deriving (Show)+instance Default BoundError where def = BoundError ; {-# INLINE def #-}+++-- === Numeric types === --++data Sign = Signed | Unsigned deriving (Show, Eq)++data NumRange = BitRange Sign Integer+ | InfiniteRange+ deriving (Show, Eq)++data NumType = NumType { _name :: Name+ , _layout :: NumRange+ } deriving (Show, Eq)+makeLenses ''NumType++intTypes :: [NumType]+intTypes = [ NumType ''Int $ BitRange Signed 30 -- according to: https://hackage.haskell.org/package/base-4.8.0.0/docs/Data-Int.html#t:Int+ , NumType ''Integer $ InfiniteRange+ , NumType ''Int8 $ BitRange Signed 8+ , NumType ''Int16 $ BitRange Signed 16+ , NumType ''Int32 $ BitRange Signed 32+ , NumType ''Int64 $ BitRange Signed 64 ] -floatTypes = [ Type ''Float $ layoutBounds $ InfiniteLayout- , Type ''Double $ layoutBounds $ InfiniteLayout- , Type ''Rational $ layoutBounds $ InfiniteLayout+wordTypes :: [NumType]+wordTypes = [ NumType ''Word $ BitRange Unsigned 30 -- according to: https://hackage.haskell.org/package/base-4.8.0.0/docs/Data-Int.html#t:Int+ , NumType ''Word8 $ BitRange Unsigned 8+ , NumType ''Word16 $ BitRange Unsigned 16+ , NumType ''Word32 $ BitRange Unsigned 32+ , NumType ''Word64 $ BitRange Unsigned 64 ] -charType = Type ''Char $ Bounds 0 1114111 -- max char enum is 1114111+floatTypes :: [NumType]+floatTypes = [ NumType ''Float $ InfiniteRange+ , NumType ''Double $ InfiniteRange+ , NumType ''Rational $ InfiniteRange+ ] +integralTypes :: [NumType] integralTypes = intTypes <> wordTypes -------------- -instance Convertible () [t] where convert _ = []-instance Convertible (t,t) [t] where convert (t1,t2) = [t1,t2]-instance Convertible (t,t,t) [t] where convert (t1,t2,t3) = [t1,t2,t3]-instance Convertible (t,t,t,t) [t] where convert (t1,t2,t3,t4) = [t1,t2,t3,t4]-instance Convertible (t,t,t,t,t) [t] where convert (t1,t2,t3,t4,t5) = [t1,t2,t3,t4,t5]-instance Convertible (t,t,t,t,t,t) [t] where convert (t1,t2,t3,t4,t5,t6) = [t1,t2,t3,t4,t5,t6]-instance Convertible (t,t,t,t,t,t,t) [t] where convert (t1,t2,t3,t4,t5,t6,t7) = [t1,t2,t3,t4,t5,t6,t7]-instance Convertible (t,t,t,t,t,t,t,t) [t] where convert (t1,t2,t3,t4,t5,t6,t7,t8) = [t1,t2,t3,t4,t5,t6,t7,t8]-instance Convertible (t,t,t,t,t,t,t,t,t) [t] where convert (t1,t2,t3,t4,t5,t6,t7,t8,t9) = [t1,t2,t3,t4,t5,t6,t7,t8,t9]+-- === Helpers === -- +defNumConvertAssert :: forall r a. (Num a, Ord a, Bounded r, Integral r) => a -> Maybe BoundError+defNumConvertAssert = defConvertAssert (> fromIntegral (maxBound @r)) ; {-# INLINE defNumConvertAssert #-} +defNumConvertAssertP :: forall r a. (Num a, Ord a, Bounded r, Integral r) => Proxy r -> a -> Maybe BoundError+defNumConvertAssertP _ = defNumConvertAssert @r ; {-# INLINE defNumConvertAssertP #-}+++-- === TH numeric conversions generators === --++mkConversion :: Q Exp -> NumType -> NumType -> Q Dec+mkConversion mf l r = do+ f <- mf+ let mkSafeConv = InstanceD Nothing [] (AppT (AppT (ConT $ mkName "Convertible") (ConT $ l ^. name)) (ConT $ r ^. name)) (inlinedFn "convert" f)+ mkPartialConv = InstanceD Nothing [] (AppT (AppT (ConT $ mkName "PartialConvertible") (ConT $ l ^. name)) (ConT $ r ^. name))+ $ cerrTInst+ : inlinedFn "unsafeConvert" f+ <> inlinedFn "convertAssert" (AppE (VarE $ mkName "defNumConvertAssertP") (proxy $ r ^. name))+ cerrTInst = TySynInstD (mkName "ConversionError") (TySynEqn [ConT $ l ^. name, ConT $ r ^. name] (ConT $ mkName "BoundError"))+ inlineAll n = PragmaD (InlineP (mkName n) Inline FunLike AllPhases)+ inlinedFn n f = [ValD (VarP $ mkName n) (NormalB f) [], inlineAll n]+ proxy n = SigE (ConE $ mkName "Proxy") (AppT (ConT $ mkName "Proxy") (ConT n))+ return $ case (l ^. layout, r ^. layout) of+ (BitRange Unsigned lbit, BitRange Unsigned rbit) -> if rbit >= lbit then mkSafeConv else mkPartialConv+ (BitRange Signed lbit, BitRange Signed rbit) -> if rbit >= lbit then mkSafeConv else mkPartialConv+ (BitRange Unsigned lbit, BitRange Signed rbit) -> if rbit >= 2*lbit then mkSafeConv else mkPartialConv+ (BitRange Signed lbit, BitRange Unsigned rbit) -> if 2*rbit >= lbit then mkSafeConv else mkPartialConv+ (InfiniteRange , BitRange _ _ ) -> mkPartialConv+ (BitRange _ _ , InfiniteRange ) -> mkSafeConv+ (InfiniteRange , InfiniteRange ) -> mkSafeConv+{-# INLINE mkConversion #-}++mkConversions :: Q Exp -> [NumType] -> [NumType] -> Q [Dec]+mkConversions exp ls rs = sequence $ mkConversion exp <$> ls <*> rs ; {-# INLINE mkConversions #-}++conversions :: Q [Dec]+conversions = do+ t1 <- mkConversions [| fromIntegral |] integralTypes (integralTypes <> floatTypes)+ t2 <- mkConversions [| truncate |] floatTypes integralTypes+ t3 <- mkConversions [| realToFrac |] floatTypes floatTypes+ return $ t1 <> t2 <> t3+{-# INLINE conversions #-}+++-- === Other instances === --+ -- TODO: http://stackoverflow.com/questions/8350814/converting-64-bit-double-to-bytestring-efficiently instance Convertible Word64 (Word8,Word8,Word8,Word8,Word8,Word8,Word8,Word8) where convert word = (unpack 56, unpack 48, unpack 40, unpack 32, unpack 24, unpack 16, unpack 8, unpack 0) where unpack = fromIntegral . shiftR word---- ...----------------+ {-# INLINE convert #-} -numConversions = conversions [| fromIntegral |] integralTypes (integralTypes <> floatTypes)- <> conversions [| truncate |] floatTypes integralTypes- <> conversions [| realToFrac |] floatTypes floatTypes- <> conversions [| fromIntegral . fromEnum |] charType (integralTypes <> floatTypes)- <> conversions [| toEnum . fromIntegral |] integralTypes charType+instance Convertible Int CSize where+ convert = fromIntegral ; {-# INLINE convert #-}
+ src/Data/Convert/Instances/OverloadedLabels.hs view
@@ -0,0 +1,23 @@+{-# LANGUAGE CPP #-}++module Data.Convert.Instances.OverloadedLabels where++import Prelude+import GHC.TypeLits+import GHC.OverloadedLabels+import Data.Proxy+import Data.Convert.Class+import Data.Convert.Instances.Text++import qualified Data.Text as Strict+import qualified Data.Text.Lazy as Lazy++#if __GLASGOW_HASKELL__ >= 802+instance KnownSymbol s => IsLabel s Strict.Text where fromLabel = convert $ symbolVal (Proxy :: Proxy s) ; {-# INLINE fromLabel #-}+instance KnownSymbol s => IsLabel s Lazy.Text where fromLabel = convert $ symbolVal (Proxy :: Proxy s) ; {-# INLINE fromLabel #-}+instance KnownSymbol s => IsLabel s String where fromLabel = symbolVal (Proxy :: Proxy s) ; {-# INLINE fromLabel #-}+#else+instance KnownSymbol s => IsLabel s Strict.Text where fromLabel _ = convert $ symbolVal (Proxy :: Proxy s) ; {-# INLINE fromLabel #-}+instance KnownSymbol s => IsLabel s Lazy.Text where fromLabel _ = convert $ symbolVal (Proxy :: Proxy s) ; {-# INLINE fromLabel #-}+instance KnownSymbol s => IsLabel s String where fromLabel _ = symbolVal (Proxy :: Proxy s) ; {-# INLINE fromLabel #-}+#endif
+ src/Data/Convert/Instances/Set.hs view
@@ -0,0 +1,9 @@+module Data.Convert.Instances.Set where++import Data.Convert.Class++import qualified Data.Set as Set+import Data.Set (Set)++instance Convertible (Set a) [a] where convert = Set.toList ; {-# INLINE convert #-}+instance Ord a => Convertible [a] (Set a) where convert = Set.fromList ; {-# INLINE convert #-}
src/Data/Convert/Instances/TH.hs view
@@ -2,9 +2,8 @@ module Data.Convert.Instances.TH where -import Data.Convert.Base-import Data.Convert.Bound-import Data.Convert.Instances.Num (numConversions)-+import Data.Convert.Class+import Data.Convert.Instances.Num as Num+import Data.Proxy -genConversions numConversions+Num.conversions
src/Data/Convert/Instances/Text.hs view
@@ -4,232 +4,99 @@ {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE TypeSynonymInstances #-}-{-# LANGUAGE CPP #-}-+{-# LANGUAGE ConstraintKinds #-} -module Data.Convert.Instances.Text()-where+module Data.Convert.Instances.Text where import Prelude+import Data.Convert.Class -import Data.Convert.Base-import qualified Data.Text as TS-import qualified Data.Text.Encoding as TE-import qualified Data.Text.Lazy as TL-import qualified Data.Text.Lazy.Builder as TLB+import Data.Default+import qualified Data.Text as TS+import qualified Data.Text.Encoding as TE+import qualified Data.Text.Lazy as TL+import qualified Data.Text.Lazy.Builder as TLB import qualified Data.Text.Lazy.Encoding as TLE-import qualified Data.ByteString as BS-import qualified Data.ByteString.Lazy as BL+import qualified Data.ByteString as BS+import qualified Data.ByteString.Lazy as BL import qualified Data.ByteString.Builder as BB-import Data.Word (Word8)-import Data.Foldable---instance Convertible TS.Text TS.Text where- {-# INLINE convert #-}- convert = id--instance Convertible TS.Text [Char] where- {-# INLINE convert #-}- convert = TS.unpack--instance Convertible TS.Text TL.Text where- {-# INLINE convert #-}- convert = TL.fromStrict--instance Convertible TS.Text TLB.Builder where- {-# INLINE convert #-}- convert = TLB.fromText--instance Convertible TS.Text BS.ByteString where- {-# INLINE convert #-}- convert = TE.encodeUtf8--instance Convertible TS.Text BL.ByteString where- {-# INLINE convert #-}- convert = BL.fromStrict . TE.encodeUtf8--instance Convertible TS.Text BB.Builder where- {-# INLINE convert #-}--- FIXME: doesnt work on OSX--- #if MIN_VERSION_text(1,2,0)- convert = TE.encodeUtf8Builder--- #else--- convert = convert . TE.encodeUtf8--- #endif----instance Convertible TL.Text TL.Text where- {-# INLINE convert #-}- convert = id--instance Convertible TL.Text [Char] where- {-# INLINE convert #-}- convert = TL.unpack--instance Convertible TL.Text TS.Text where- {-# INLINE convert #-}- convert = TL.toStrict--instance Convertible TL.Text TLB.Builder where- {-# INLINE convert #-}- convert = TLB.fromLazyText--instance Convertible TL.Text BS.ByteString where- {-# INLINE convert #-}- convert = convert . TLE.encodeUtf8--instance Convertible TL.Text BL.ByteString where- {-# INLINE convert #-}- convert = TLE.encodeUtf8--instance Convertible TL.Text BB.Builder where- {-# INLINE convert #-}--- FIXME: doesnt work on OSX--- #if MIN_VERSION_text(1,2,0)- convert = TLE.encodeUtf8Builder--- #else--- convert = convert . TLE.encodeUtf8--- #endif----instance Convertible TLB.Builder TLB.Builder where- {-# INLINE convert #-}- convert = id--instance Convertible TLB.Builder [Char] where- {-# INLINE convert #-}- convert = convert . TLB.toLazyText--instance Convertible TLB.Builder TS.Text where- {-# INLINE convert #-}- convert = convert . TLB.toLazyText--instance Convertible TLB.Builder TL.Text where- {-# INLINE convert #-}- convert = TLB.toLazyText--instance Convertible TLB.Builder BS.ByteString where- {-# INLINE convert #-}- convert = convert . TLB.toLazyText--instance Convertible TLB.Builder BL.ByteString where- {-# INLINE convert #-}- convert = convert . TLB.toLazyText--instance Convertible TLB.Builder BB.Builder where- {-# INLINE convert #-}- convert = convert . TLB.toLazyText---instance Convertible BS.ByteString BS.ByteString where- {-# INLINE convert #-}- convert = id--instance Convertible BS.ByteString [Word8] where- {-# INLINE convert #-}- convert = BS.unpack--instance Convertible BS.ByteString TS.Text where- {-# INLINE convert #-}- convert = TE.decodeUtf8--instance Convertible BS.ByteString TL.Text where- {-# INLINE convert #-}- convert = TL.fromStrict . convert--instance Convertible BS.ByteString TLB.Builder where- {-# INLINE convert #-}- convert = TLB.fromText . convert--instance Convertible BS.ByteString BL.ByteString where- {-# INLINE convert #-}- convert = BL.fromStrict--instance Convertible BS.ByteString BB.Builder where- {-# INLINE convert #-}- convert = BB.byteString----instance Convertible BL.ByteString [Word8] where- {-# INLINE convert #-}- convert = BL.unpack--instance Convertible BL.ByteString TS.Text where- {-# INLINE convert #-}- convert = TL.toStrict . convert--instance Convertible BL.ByteString TL.Text where- {-# INLINE convert #-}- convert = TLE.decodeUtf8--instance Convertible BL.ByteString TLB.Builder where- {-# INLINE convert #-}- convert = TLB.fromLazyText . convert--instance Convertible BL.ByteString BS.ByteString where- {-# INLINE convert #-}- convert = BL.toStrict--instance Convertible BL.ByteString BB.Builder where- {-# INLINE convert #-}- convert = BB.lazyByteString+import Data.Word (Word8)+import Data.Foldable +import Data.Convert.Instances.ByteString () -instance Convertible [Char] TS.Text where- {-# INLINE convert #-}- convert = TS.pack+-- === Utils === -- -instance Convertible [Char] TL.Text where- {-# INLINE convert #-}- convert = TL.pack+type ToLazyText a = Convertible a TL.Text+type ToText a = Convertible a TS.Text+type FromLazyText a = Convertible TL.Text a+type FromText a = Convertible TS.Text a+type IsText a = BiConvertible TS.Text a+type IsLazyText a = BiConvertible TL.Text a -instance Convertible [Char] TLB.Builder where- {-# INLINE convert #-}- convert = TLB.fromString+toText :: ToText a => a -> TS.Text+fromText :: FromText a => TS.Text -> a+toText = convert ; {-# INLINE toText #-}+fromText = convert ; {-# INLINE fromText #-} +toLazyText :: ToLazyText a => a -> TL.Text+fromLazyText :: FromLazyText a => TL.Text -> a+toLazyText = convert ; {-# INLINE toLazyText #-}+fromLazyText = convert ; {-# INLINE fromLazyText #-} -instance Convertible [Word8] BS.ByteString where- {-# INLINE convert #-}- convert = BS.pack--instance Convertible [Word8] BL.ByteString where- {-# INLINE convert #-}- convert = BL.pack--instance Convertible [Word8] BB.Builder where- {-# INLINE convert #-}- convert = foldMap BB.word8+-- === Intances === -- +instance Default TS.Text where def = convert "" ; {-# INLINE def #-}+instance Default TL.Text where def = convert "" ; {-# INLINE def #-}+instance Default TLB.Builder where def = convert "" ; {-# INLINE def #-} +instance Convertible TS.Text String where convert = TS.unpack ; {-# INLINE convert #-}+instance Convertible TS.Text TL.Text where convert = TL.fromStrict ; {-# INLINE convert #-}+instance Convertible TS.Text TLB.Builder where convert = TLB.fromText ; {-# INLINE convert #-}+instance Convertible TS.Text BS.ByteString where convert = TE.encodeUtf8 ; {-# INLINE convert #-}+instance Convertible TS.Text BL.ByteString where convert = BL.fromStrict . TE.encodeUtf8 ; {-# INLINE convert #-}+instance Convertible TS.Text BB.Builder where convert = TE.encodeUtf8Builder ; {-# INLINE convert #-} -instance Convertible Char TS.Text where- {-# INLINE convert #-}- convert = TS.singleton+instance Convertible TL.Text String where convert = TL.unpack ; {-# INLINE convert #-}+instance Convertible TL.Text TS.Text where convert = TL.toStrict ; {-# INLINE convert #-}+instance Convertible TL.Text TLB.Builder where convert = TLB.fromLazyText ; {-# INLINE convert #-}+instance Convertible TL.Text BS.ByteString where convert = convert . TLE.encodeUtf8 ; {-# INLINE convert #-}+instance Convertible TL.Text BL.ByteString where convert = TLE.encodeUtf8 ; {-# INLINE convert #-}+instance Convertible TL.Text BB.Builder where convert = TLE.encodeUtf8Builder ; {-# INLINE convert #-} -instance Convertible Char TL.Text where- {-# INLINE convert #-}- convert = TL.singleton+instance Convertible TLB.Builder String where convert = convert . TLB.toLazyText ; {-# INLINE convert #-}+instance Convertible TLB.Builder TS.Text where convert = convert . TLB.toLazyText ; {-# INLINE convert #-}+instance Convertible TLB.Builder TL.Text where convert = TLB.toLazyText ; {-# INLINE convert #-}+instance Convertible TLB.Builder BS.ByteString where convert = convert . TLB.toLazyText ; {-# INLINE convert #-}+instance Convertible TLB.Builder BL.ByteString where convert = convert . TLB.toLazyText ; {-# INLINE convert #-}+instance Convertible TLB.Builder BB.Builder where convert = convert . TLB.toLazyText ; {-# INLINE convert #-} -instance Convertible Char TLB.Builder where- {-# INLINE convert #-}- convert = TLB.singleton+instance Convertible BS.ByteString [Word8] where convert = BS.unpack ; {-# INLINE convert #-}+instance Convertible BS.ByteString TS.Text where convert = TE.decodeUtf8 ; {-# INLINE convert #-}+instance Convertible BS.ByteString TL.Text where convert = TL.fromStrict . convert ; {-# INLINE convert #-}+instance Convertible BS.ByteString TLB.Builder where convert = TLB.fromText . convert ; {-# INLINE convert #-}+instance Convertible BS.ByteString BB.Builder where convert = BB.byteString ; {-# INLINE convert #-} +instance Convertible BL.ByteString [Word8] where convert = BL.unpack ; {-# INLINE convert #-}+instance Convertible BL.ByteString TS.Text where convert = TL.toStrict . convert ; {-# INLINE convert #-}+instance Convertible BL.ByteString TL.Text where convert = TLE.decodeUtf8 ; {-# INLINE convert #-}+instance Convertible BL.ByteString TLB.Builder where convert = TLB.fromLazyText . convert ; {-# INLINE convert #-}+instance Convertible BL.ByteString BB.Builder where convert = BB.lazyByteString ; {-# INLINE convert #-} +instance Convertible String TS.Text where convert = TS.pack ; {-# INLINE convert #-}+instance Convertible String TL.Text where convert = TL.pack ; {-# INLINE convert #-}+instance Convertible String TLB.Builder where convert = TLB.fromString ; {-# INLINE convert #-} -instance Convertible Word8 BS.ByteString where- {-# INLINE convert #-}- convert = BS.singleton+instance Convertible [Word8] BS.ByteString where convert = BS.pack ; {-# INLINE convert #-}+instance Convertible [Word8] BL.ByteString where convert = BL.pack ; {-# INLINE convert #-}+instance Convertible [Word8] BB.Builder where convert = foldMap BB.word8 ; {-# INLINE convert #-} -instance Convertible Word8 BL.ByteString where- {-# INLINE convert #-}- convert = BL.singleton+instance Convertible Char TS.Text where convert = TS.singleton ; {-# INLINE convert #-}+instance Convertible Char TL.Text where convert = TL.singleton ; {-# INLINE convert #-}+instance Convertible Char TLB.Builder where convert = TLB.singleton ; {-# INLINE convert #-} -instance Convertible Word8 BB.Builder where- {-# INLINE convert #-}- convert = BB.word8+instance Convertible Word8 BS.ByteString where convert = BS.singleton ; {-# INLINE convert #-}+instance Convertible Word8 BL.ByteString where convert = BL.singleton ; {-# INLINE convert #-}+instance Convertible Word8 BB.Builder where convert = BB.word8 ; {-# INLINE convert #-}
+ src/Data/Convert/Instances/Tuple.hs view
@@ -0,0 +1,67 @@+module Data.Convert.Instances.Tuple where+++import Data.Convert.Class+++instance (Convertible a1 b1, Convertible a2 b2) => Convertible (a1,a2) (b1,b2) where convert (a1,a2) = (convert a1, convert a2)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3) => Convertible (a1,a2,a3) (b1,b2,b3) where convert (a1,a2,a3) = (convert a1, convert a2, convert a3)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4) => Convertible (a1,a2,a3,a4) (b1,b2,b3,b4) where convert (a1,a2,a3,a4) = (convert a1, convert a2, convert a3, convert a4)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4, Convertible a5 b5) => Convertible (a1,a2,a3,a4,a5) (b1,b2,b3,b4,b5) where convert (a1,a2,a3,a4,a5) = (convert a1, convert a2, convert a3, convert a4, convert a5)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4, Convertible a5 b5, Convertible a6 b6) => Convertible (a1,a2,a3,a4,a5,a6) (b1,b2,b3,b4,b5,b6) where convert (a1,a2,a3,a4,a5,a6) = (convert a1, convert a2, convert a3, convert a4, convert a5, convert a6)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4, Convertible a5 b5, Convertible a6 b6, Convertible a7 b7) => Convertible (a1,a2,a3,a4,a5,a6,a7) (b1,b2,b3,b4,b5,b6,b7) where convert (a1,a2,a3,a4,a5,a6,a7) = (convert a1, convert a2, convert a3, convert a4, convert a5, convert a6, convert a7)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4, Convertible a5 b5, Convertible a6 b6, Convertible a7 b7, Convertible a8 b8) => Convertible (a1,a2,a3,a4,a5,a6,a7,a8) (b1,b2,b3,b4,b5,b6,b7,b8) where convert (a1,a2,a3,a4,a5,a6,a7,a8) = (convert a1, convert a2, convert a3, convert a4, convert a5, convert a6, convert a7, convert a8)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4, Convertible a5 b5, Convertible a6 b6, Convertible a7 b7, Convertible a8 b8, Convertible a9 b9) => Convertible (a1,a2,a3,a4,a5,a6,a7,a8,a9) (b1,b2,b3,b4,b5,b6,b7,b8,b9) where convert (a1,a2,a3,a4,a5,a6,a7,a8,a9) = (convert a1, convert a2, convert a3, convert a4, convert a5, convert a6, convert a7, convert a8, convert a9)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4, Convertible a5 b5, Convertible a6 b6, Convertible a7 b7, Convertible a8 b8, Convertible a9 b9, Convertible a10 b10) => Convertible (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10) (b1,b2,b3,b4,b5,b6,b7,b8,b9,b10) where convert (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10) = (convert a1, convert a2, convert a3, convert a4, convert a5, convert a6, convert a7, convert a8, convert a9, convert a10)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4, Convertible a5 b5, Convertible a6 b6, Convertible a7 b7, Convertible a8 b8, Convertible a9 b9, Convertible a10 b10, Convertible a11 b11) => Convertible (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11) (b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11) where convert (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11) = (convert a1, convert a2, convert a3, convert a4, convert a5, convert a6, convert a7, convert a8, convert a9, convert a10, convert a11)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4, Convertible a5 b5, Convertible a6 b6, Convertible a7 b7, Convertible a8 b8, Convertible a9 b9, Convertible a10 b10, Convertible a11 b11, Convertible a12 b12) => Convertible (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 convert (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12) = (convert a1, convert a2, convert a3, convert a4, convert a5, convert a6, convert a7, convert a8, convert a9, convert a10, convert a11, convert a12)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4, Convertible a5 b5, Convertible a6 b6, Convertible a7 b7, Convertible a8 b8, Convertible a9 b9, Convertible a10 b10, Convertible a11 b11, Convertible a12 b12, Convertible a13 b13) => Convertible (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 convert (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13) = (convert a1, convert a2, convert a3, convert a4, convert a5, convert a6, convert a7, convert a8, convert a9, convert a10, convert a11, convert a12, convert a13)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4, Convertible a5 b5, Convertible a6 b6, Convertible a7 b7, Convertible a8 b8, Convertible a9 b9, Convertible a10 b10, Convertible a11 b11, Convertible a12 b12, Convertible a13 b13, Convertible a14 b14) => Convertible (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 convert (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14) = (convert a1, convert a2, convert a3, convert a4, convert a5, convert a6, convert a7, convert a8, convert a9, convert a10, convert a11, convert a12, convert a13, convert a14)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4, Convertible a5 b5, Convertible a6 b6, Convertible a7 b7, Convertible a8 b8, Convertible a9 b9, Convertible a10 b10, Convertible a11 b11, Convertible a12 b12, Convertible a13 b13, Convertible a14 b14, Convertible a15 b15) => Convertible (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 convert (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15) = (convert a1, convert a2, convert a3, convert a4, convert a5, convert a6, convert a7, convert a8, convert a9, convert a10, convert a11, convert a12, convert a13, convert a14, convert a15)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4, Convertible a5 b5, Convertible a6 b6, Convertible a7 b7, Convertible a8 b8, Convertible a9 b9, Convertible a10 b10, Convertible a11 b11, Convertible a12 b12, Convertible a13 b13, Convertible a14 b14, Convertible a15 b15, Convertible a16 b16) => Convertible (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 convert (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16) = (convert a1, convert a2, convert a3, convert a4, convert a5, convert a6, convert a7, convert a8, convert a9, convert a10, convert a11, convert a12, convert a13, convert a14, convert a15, convert a16)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4, Convertible a5 b5, Convertible a6 b6, Convertible a7 b7, Convertible a8 b8, Convertible a9 b9, Convertible a10 b10, Convertible a11 b11, Convertible a12 b12, Convertible a13 b13, Convertible a14 b14, Convertible a15 b15, Convertible a16 b16, Convertible a17 b17) => Convertible (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 convert (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17) = (convert a1, convert a2, convert a3, convert a4, convert a5, convert a6, convert a7, convert a8, convert a9, convert a10, convert a11, convert a12, convert a13, convert a14, convert a15, convert a16, convert a17)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4, Convertible a5 b5, Convertible a6 b6, Convertible a7 b7, Convertible a8 b8, Convertible a9 b9, Convertible a10 b10, Convertible a11 b11, Convertible a12 b12, Convertible a13 b13, Convertible a14 b14, Convertible a15 b15, Convertible a16 b16, Convertible a17 b17, Convertible a18 b18) => Convertible (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 convert (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18) = (convert a1, convert a2, convert a3, convert a4, convert a5, convert a6, convert a7, convert a8, convert a9, convert a10, convert a11, convert a12, convert a13, convert a14, convert a15, convert a16, convert a17, convert a18)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4, Convertible a5 b5, Convertible a6 b6, Convertible a7 b7, Convertible a8 b8, Convertible a9 b9, Convertible a10 b10, Convertible a11 b11, Convertible a12 b12, Convertible a13 b13, Convertible a14 b14, Convertible a15 b15, Convertible a16 b16, Convertible a17 b17, Convertible a18 b18, Convertible a19 b19) => Convertible (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 convert (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19) = (convert a1, convert a2, convert a3, convert a4, convert a5, convert a6, convert a7, convert a8, convert a9, convert a10, convert a11, convert a12, convert a13, convert a14, convert a15, convert a16, convert a17, convert a18, convert a19)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4, Convertible a5 b5, Convertible a6 b6, Convertible a7 b7, Convertible a8 b8, Convertible a9 b9, Convertible a10 b10, Convertible a11 b11, Convertible a12 b12, Convertible a13 b13, Convertible a14 b14, Convertible a15 b15, Convertible a16 b16, Convertible a17 b17, Convertible a18 b18, Convertible a19 b19, Convertible a20 b20) => Convertible (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 convert (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20) = (convert a1, convert a2, convert a3, convert a4, convert a5, convert a6, convert a7, convert a8, convert a9, convert a10, convert a11, convert a12, convert a13, convert a14, convert a15, convert a16, convert a17, convert a18, convert a19, convert a20)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4, Convertible a5 b5, Convertible a6 b6, Convertible a7 b7, Convertible a8 b8, Convertible a9 b9, Convertible a10 b10, Convertible a11 b11, Convertible a12 b12, Convertible a13 b13, Convertible a14 b14, Convertible a15 b15, Convertible a16 b16, Convertible a17 b17, Convertible a18 b18, Convertible a19 b19, Convertible a20 b20, Convertible a21 b21) => Convertible (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 convert (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21) = (convert a1, convert a2, convert a3, convert a4, convert a5, convert a6, convert a7, convert a8, convert a9, convert a10, convert a11, convert a12, convert a13, convert a14, convert a15, convert a16, convert a17, convert a18, convert a19, convert a20, convert a21)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4, Convertible a5 b5, Convertible a6 b6, Convertible a7 b7, Convertible a8 b8, Convertible a9 b9, Convertible a10 b10, Convertible a11 b11, Convertible a12 b12, Convertible a13 b13, Convertible a14 b14, Convertible a15 b15, Convertible a16 b16, Convertible a17 b17, Convertible a18 b18, Convertible a19 b19, Convertible a20 b20, Convertible a21 b21, Convertible a22 b22) => Convertible (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 convert (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22) = (convert a1, convert a2, convert a3, convert a4, convert a5, convert a6, convert a7, convert a8, convert a9, convert a10, convert a11, convert a12, convert a13, convert a14, convert a15, convert a16, convert a17, convert a18, convert a19, convert a20, convert a21, convert a22)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4, Convertible a5 b5, Convertible a6 b6, Convertible a7 b7, Convertible a8 b8, Convertible a9 b9, Convertible a10 b10, Convertible a11 b11, Convertible a12 b12, Convertible a13 b13, Convertible a14 b14, Convertible a15 b15, Convertible a16 b16, Convertible a17 b17, Convertible a18 b18, Convertible a19 b19, Convertible a20 b20, Convertible a21 b21, Convertible a22 b22, Convertible a23 b23) => Convertible (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 convert (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23) = (convert a1, convert a2, convert a3, convert a4, convert a5, convert a6, convert a7, convert a8, convert a9, convert a10, convert a11, convert a12, convert a13, convert a14, convert a15, convert a16, convert a17, convert a18, convert a19, convert a20, convert a21, convert a22, convert a23)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4, Convertible a5 b5, Convertible a6 b6, Convertible a7 b7, Convertible a8 b8, Convertible a9 b9, Convertible a10 b10, Convertible a11 b11, Convertible a12 b12, Convertible a13 b13, Convertible a14 b14, Convertible a15 b15, Convertible a16 b16, Convertible a17 b17, Convertible a18 b18, Convertible a19 b19, Convertible a20 b20, Convertible a21 b21, Convertible a22 b22, Convertible a23 b23, Convertible a24 b24) => Convertible (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 convert (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24) = (convert a1, convert a2, convert a3, convert a4, convert a5, convert a6, convert a7, convert a8, convert a9, convert a10, convert a11, convert a12, convert a13, convert a14, convert a15, convert a16, convert a17, convert a18, convert a19, convert a20, convert a21, convert a22, convert a23, convert a24)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4, Convertible a5 b5, Convertible a6 b6, Convertible a7 b7, Convertible a8 b8, Convertible a9 b9, Convertible a10 b10, Convertible a11 b11, Convertible a12 b12, Convertible a13 b13, Convertible a14 b14, Convertible a15 b15, Convertible a16 b16, Convertible a17 b17, Convertible a18 b18, Convertible a19 b19, Convertible a20 b20, Convertible a21 b21, Convertible a22 b22, Convertible a23 b23, Convertible a24 b24, Convertible a25 b25) => Convertible (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25) (b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b22,b23,b24,b25) where convert (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25) = (convert a1, convert a2, convert a3, convert a4, convert a5, convert a6, convert a7, convert a8, convert a9, convert a10, convert a11, convert a12, convert a13, convert a14, convert a15, convert a16, convert a17, convert a18, convert a19, convert a20, convert a21, convert a22, convert a23, convert a24, convert a25)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4, Convertible a5 b5, Convertible a6 b6, Convertible a7 b7, Convertible a8 b8, Convertible a9 b9, Convertible a10 b10, Convertible a11 b11, Convertible a12 b12, Convertible a13 b13, Convertible a14 b14, Convertible a15 b15, Convertible a16 b16, Convertible a17 b17, Convertible a18 b18, Convertible a19 b19, Convertible a20 b20, Convertible a21 b21, Convertible a22 b22, Convertible a23 b23, Convertible a24 b24, Convertible a25 b25, Convertible a26 b26) => Convertible (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26) (b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b22,b23,b24,b25,b26) where convert (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26) = (convert a1, convert a2, convert a3, convert a4, convert a5, convert a6, convert a7, convert a8, convert a9, convert a10, convert a11, convert a12, convert a13, convert a14, convert a15, convert a16, convert a17, convert a18, convert a19, convert a20, convert a21, convert a22, convert a23, convert a24, convert a25, convert a26)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4, Convertible a5 b5, Convertible a6 b6, Convertible a7 b7, Convertible a8 b8, Convertible a9 b9, Convertible a10 b10, Convertible a11 b11, Convertible a12 b12, Convertible a13 b13, Convertible a14 b14, Convertible a15 b15, Convertible a16 b16, Convertible a17 b17, Convertible a18 b18, Convertible a19 b19, Convertible a20 b20, Convertible a21 b21, Convertible a22 b22, Convertible a23 b23, Convertible a24 b24, Convertible a25 b25, Convertible a26 b26, Convertible a27 b27) => Convertible (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27) (b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b22,b23,b24,b25,b26,b27) where convert (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27) = (convert a1, convert a2, convert a3, convert a4, convert a5, convert a6, convert a7, convert a8, convert a9, convert a10, convert a11, convert a12, convert a13, convert a14, convert a15, convert a16, convert a17, convert a18, convert a19, convert a20, convert a21, convert a22, convert a23, convert a24, convert a25, convert a26, convert a27)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4, Convertible a5 b5, Convertible a6 b6, Convertible a7 b7, Convertible a8 b8, Convertible a9 b9, Convertible a10 b10, Convertible a11 b11, Convertible a12 b12, Convertible a13 b13, Convertible a14 b14, Convertible a15 b15, Convertible a16 b16, Convertible a17 b17, Convertible a18 b18, Convertible a19 b19, Convertible a20 b20, Convertible a21 b21, Convertible a22 b22, Convertible a23 b23, Convertible a24 b24, Convertible a25 b25, Convertible a26 b26, Convertible a27 b27, Convertible a28 b28) => Convertible (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28) (b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b22,b23,b24,b25,b26,b27,b28) where convert (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28) = (convert a1, convert a2, convert a3, convert a4, convert a5, convert a6, convert a7, convert a8, convert a9, convert a10, convert a11, convert a12, convert a13, convert a14, convert a15, convert a16, convert a17, convert a18, convert a19, convert a20, convert a21, convert a22, convert a23, convert a24, convert a25, convert a26, convert a27, convert a28)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4, Convertible a5 b5, Convertible a6 b6, Convertible a7 b7, Convertible a8 b8, Convertible a9 b9, Convertible a10 b10, Convertible a11 b11, Convertible a12 b12, Convertible a13 b13, Convertible a14 b14, Convertible a15 b15, Convertible a16 b16, Convertible a17 b17, Convertible a18 b18, Convertible a19 b19, Convertible a20 b20, Convertible a21 b21, Convertible a22 b22, Convertible a23 b23, Convertible a24 b24, Convertible a25 b25, Convertible a26 b26, Convertible a27 b27, Convertible a28 b28, Convertible a29 b29) => Convertible (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29) (b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b22,b23,b24,b25,b26,b27,b28,b29) where convert (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29) = (convert a1, convert a2, convert a3, convert a4, convert a5, convert a6, convert a7, convert a8, convert a9, convert a10, convert a11, convert a12, convert a13, convert a14, convert a15, convert a16, convert a17, convert a18, convert a19, convert a20, convert a21, convert a22, convert a23, convert a24, convert a25, convert a26, convert a27, convert a28, convert a29)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4, Convertible a5 b5, Convertible a6 b6, Convertible a7 b7, Convertible a8 b8, Convertible a9 b9, Convertible a10 b10, Convertible a11 b11, Convertible a12 b12, Convertible a13 b13, Convertible a14 b14, Convertible a15 b15, Convertible a16 b16, Convertible a17 b17, Convertible a18 b18, Convertible a19 b19, Convertible a20 b20, Convertible a21 b21, Convertible a22 b22, Convertible a23 b23, Convertible a24 b24, Convertible a25 b25, Convertible a26 b26, Convertible a27 b27, Convertible a28 b28, Convertible a29 b29, Convertible a30 b30) => Convertible (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30) (b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b22,b23,b24,b25,b26,b27,b28,b29,b30) where convert (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30) = (convert a1, convert a2, convert a3, convert a4, convert a5, convert a6, convert a7, convert a8, convert a9, convert a10, convert a11, convert a12, convert a13, convert a14, convert a15, convert a16, convert a17, convert a18, convert a19, convert a20, convert a21, convert a22, convert a23, convert a24, convert a25, convert a26, convert a27, convert a28, convert a29, convert a30)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4, Convertible a5 b5, Convertible a6 b6, Convertible a7 b7, Convertible a8 b8, Convertible a9 b9, Convertible a10 b10, Convertible a11 b11, Convertible a12 b12, Convertible a13 b13, Convertible a14 b14, Convertible a15 b15, Convertible a16 b16, Convertible a17 b17, Convertible a18 b18, Convertible a19 b19, Convertible a20 b20, Convertible a21 b21, Convertible a22 b22, Convertible a23 b23, Convertible a24 b24, Convertible a25 b25, Convertible a26 b26, Convertible a27 b27, Convertible a28 b28, Convertible a29 b29, Convertible a30 b30, Convertible a31 b31) => Convertible (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31) (b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b22,b23,b24,b25,b26,b27,b28,b29,b30,b31) where convert (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31) = (convert a1, convert a2, convert a3, convert a4, convert a5, convert a6, convert a7, convert a8, convert a9, convert a10, convert a11, convert a12, convert a13, convert a14, convert a15, convert a16, convert a17, convert a18, convert a19, convert a20, convert a21, convert a22, convert a23, convert a24, convert a25, convert a26, convert a27, convert a28, convert a29, convert a30, convert a31)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4, Convertible a5 b5, Convertible a6 b6, Convertible a7 b7, Convertible a8 b8, Convertible a9 b9, Convertible a10 b10, Convertible a11 b11, Convertible a12 b12, Convertible a13 b13, Convertible a14 b14, Convertible a15 b15, Convertible a16 b16, Convertible a17 b17, Convertible a18 b18, Convertible a19 b19, Convertible a20 b20, Convertible a21 b21, Convertible a22 b22, Convertible a23 b23, Convertible a24 b24, Convertible a25 b25, Convertible a26 b26, Convertible a27 b27, Convertible a28 b28, Convertible a29 b29, Convertible a30 b30, Convertible a31 b31, Convertible a32 b32) => Convertible (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32) (b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b22,b23,b24,b25,b26,b27,b28,b29,b30,b31,b32) where convert (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32) = (convert a1, convert a2, convert a3, convert a4, convert a5, convert a6, convert a7, convert a8, convert a9, convert a10, convert a11, convert a12, convert a13, convert a14, convert a15, convert a16, convert a17, convert a18, convert a19, convert a20, convert a21, convert a22, convert a23, convert a24, convert a25, convert a26, convert a27, convert a28, convert a29, convert a30, convert a31, convert a32)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4, Convertible a5 b5, Convertible a6 b6, Convertible a7 b7, Convertible a8 b8, Convertible a9 b9, Convertible a10 b10, Convertible a11 b11, Convertible a12 b12, Convertible a13 b13, Convertible a14 b14, Convertible a15 b15, Convertible a16 b16, Convertible a17 b17, Convertible a18 b18, Convertible a19 b19, Convertible a20 b20, Convertible a21 b21, Convertible a22 b22, Convertible a23 b23, Convertible a24 b24, Convertible a25 b25, Convertible a26 b26, Convertible a27 b27, Convertible a28 b28, Convertible a29 b29, Convertible a30 b30, Convertible a31 b31, Convertible a32 b32, Convertible a33 b33) => Convertible (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33) (b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b22,b23,b24,b25,b26,b27,b28,b29,b30,b31,b32,b33) where convert (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33) = (convert a1, convert a2, convert a3, convert a4, convert a5, convert a6, convert a7, convert a8, convert a9, convert a10, convert a11, convert a12, convert a13, convert a14, convert a15, convert a16, convert a17, convert a18, convert a19, convert a20, convert a21, convert a22, convert a23, convert a24, convert a25, convert a26, convert a27, convert a28, convert a29, convert a30, convert a31, convert a32, convert a33)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4, Convertible a5 b5, Convertible a6 b6, Convertible a7 b7, Convertible a8 b8, Convertible a9 b9, Convertible a10 b10, Convertible a11 b11, Convertible a12 b12, Convertible a13 b13, Convertible a14 b14, Convertible a15 b15, Convertible a16 b16, Convertible a17 b17, Convertible a18 b18, Convertible a19 b19, Convertible a20 b20, Convertible a21 b21, Convertible a22 b22, Convertible a23 b23, Convertible a24 b24, Convertible a25 b25, Convertible a26 b26, Convertible a27 b27, Convertible a28 b28, Convertible a29 b29, Convertible a30 b30, Convertible a31 b31, Convertible a32 b32, Convertible a33 b33, Convertible a34 b34) => Convertible (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34) (b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b22,b23,b24,b25,b26,b27,b28,b29,b30,b31,b32,b33,b34) where convert (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34) = (convert a1, convert a2, convert a3, convert a4, convert a5, convert a6, convert a7, convert a8, convert a9, convert a10, convert a11, convert a12, convert a13, convert a14, convert a15, convert a16, convert a17, convert a18, convert a19, convert a20, convert a21, convert a22, convert a23, convert a24, convert a25, convert a26, convert a27, convert a28, convert a29, convert a30, convert a31, convert a32, convert a33, convert a34)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4, Convertible a5 b5, Convertible a6 b6, Convertible a7 b7, Convertible a8 b8, Convertible a9 b9, Convertible a10 b10, Convertible a11 b11, Convertible a12 b12, Convertible a13 b13, Convertible a14 b14, Convertible a15 b15, Convertible a16 b16, Convertible a17 b17, Convertible a18 b18, Convertible a19 b19, Convertible a20 b20, Convertible a21 b21, Convertible a22 b22, Convertible a23 b23, Convertible a24 b24, Convertible a25 b25, Convertible a26 b26, Convertible a27 b27, Convertible a28 b28, Convertible a29 b29, Convertible a30 b30, Convertible a31 b31, Convertible a32 b32, Convertible a33 b33, Convertible a34 b34, Convertible a35 b35) => Convertible (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35) (b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b22,b23,b24,b25,b26,b27,b28,b29,b30,b31,b32,b33,b34,b35) where convert (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35) = (convert a1, convert a2, convert a3, convert a4, convert a5, convert a6, convert a7, convert a8, convert a9, convert a10, convert a11, convert a12, convert a13, convert a14, convert a15, convert a16, convert a17, convert a18, convert a19, convert a20, convert a21, convert a22, convert a23, convert a24, convert a25, convert a26, convert a27, convert a28, convert a29, convert a30, convert a31, convert a32, convert a33, convert a34, convert a35)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4, Convertible a5 b5, Convertible a6 b6, Convertible a7 b7, Convertible a8 b8, Convertible a9 b9, Convertible a10 b10, Convertible a11 b11, Convertible a12 b12, Convertible a13 b13, Convertible a14 b14, Convertible a15 b15, Convertible a16 b16, Convertible a17 b17, Convertible a18 b18, Convertible a19 b19, Convertible a20 b20, Convertible a21 b21, Convertible a22 b22, Convertible a23 b23, Convertible a24 b24, Convertible a25 b25, Convertible a26 b26, Convertible a27 b27, Convertible a28 b28, Convertible a29 b29, Convertible a30 b30, Convertible a31 b31, Convertible a32 b32, Convertible a33 b33, Convertible a34 b34, Convertible a35 b35, Convertible a36 b36) => Convertible (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36) (b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b22,b23,b24,b25,b26,b27,b28,b29,b30,b31,b32,b33,b34,b35,b36) where convert (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36) = (convert a1, convert a2, convert a3, convert a4, convert a5, convert a6, convert a7, convert a8, convert a9, convert a10, convert a11, convert a12, convert a13, convert a14, convert a15, convert a16, convert a17, convert a18, convert a19, convert a20, convert a21, convert a22, convert a23, convert a24, convert a25, convert a26, convert a27, convert a28, convert a29, convert a30, convert a31, convert a32, convert a33, convert a34, convert a35, convert a36)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4, Convertible a5 b5, Convertible a6 b6, Convertible a7 b7, Convertible a8 b8, Convertible a9 b9, Convertible a10 b10, Convertible a11 b11, Convertible a12 b12, Convertible a13 b13, Convertible a14 b14, Convertible a15 b15, Convertible a16 b16, Convertible a17 b17, Convertible a18 b18, Convertible a19 b19, Convertible a20 b20, Convertible a21 b21, Convertible a22 b22, Convertible a23 b23, Convertible a24 b24, Convertible a25 b25, Convertible a26 b26, Convertible a27 b27, Convertible a28 b28, Convertible a29 b29, Convertible a30 b30, Convertible a31 b31, Convertible a32 b32, Convertible a33 b33, Convertible a34 b34, Convertible a35 b35, Convertible a36 b36, Convertible a37 b37) => Convertible (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37) (b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b22,b23,b24,b25,b26,b27,b28,b29,b30,b31,b32,b33,b34,b35,b36,b37) where convert (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37) = (convert a1, convert a2, convert a3, convert a4, convert a5, convert a6, convert a7, convert a8, convert a9, convert a10, convert a11, convert a12, convert a13, convert a14, convert a15, convert a16, convert a17, convert a18, convert a19, convert a20, convert a21, convert a22, convert a23, convert a24, convert a25, convert a26, convert a27, convert a28, convert a29, convert a30, convert a31, convert a32, convert a33, convert a34, convert a35, convert a36, convert a37)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4, Convertible a5 b5, Convertible a6 b6, Convertible a7 b7, Convertible a8 b8, Convertible a9 b9, Convertible a10 b10, Convertible a11 b11, Convertible a12 b12, Convertible a13 b13, Convertible a14 b14, Convertible a15 b15, Convertible a16 b16, Convertible a17 b17, Convertible a18 b18, Convertible a19 b19, Convertible a20 b20, Convertible a21 b21, Convertible a22 b22, Convertible a23 b23, Convertible a24 b24, Convertible a25 b25, Convertible a26 b26, Convertible a27 b27, Convertible a28 b28, Convertible a29 b29, Convertible a30 b30, Convertible a31 b31, Convertible a32 b32, Convertible a33 b33, Convertible a34 b34, Convertible a35 b35, Convertible a36 b36, Convertible a37 b37, Convertible a38 b38) => Convertible (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38) (b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b22,b23,b24,b25,b26,b27,b28,b29,b30,b31,b32,b33,b34,b35,b36,b37,b38) where convert (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38) = (convert a1, convert a2, convert a3, convert a4, convert a5, convert a6, convert a7, convert a8, convert a9, convert a10, convert a11, convert a12, convert a13, convert a14, convert a15, convert a16, convert a17, convert a18, convert a19, convert a20, convert a21, convert a22, convert a23, convert a24, convert a25, convert a26, convert a27, convert a28, convert a29, convert a30, convert a31, convert a32, convert a33, convert a34, convert a35, convert a36, convert a37, convert a38)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4, Convertible a5 b5, Convertible a6 b6, Convertible a7 b7, Convertible a8 b8, Convertible a9 b9, Convertible a10 b10, Convertible a11 b11, Convertible a12 b12, Convertible a13 b13, Convertible a14 b14, Convertible a15 b15, Convertible a16 b16, Convertible a17 b17, Convertible a18 b18, Convertible a19 b19, Convertible a20 b20, Convertible a21 b21, Convertible a22 b22, Convertible a23 b23, Convertible a24 b24, Convertible a25 b25, Convertible a26 b26, Convertible a27 b27, Convertible a28 b28, Convertible a29 b29, Convertible a30 b30, Convertible a31 b31, Convertible a32 b32, Convertible a33 b33, Convertible a34 b34, Convertible a35 b35, Convertible a36 b36, Convertible a37 b37, Convertible a38 b38, Convertible a39 b39) => Convertible (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39) (b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b22,b23,b24,b25,b26,b27,b28,b29,b30,b31,b32,b33,b34,b35,b36,b37,b38,b39) where convert (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39) = (convert a1, convert a2, convert a3, convert a4, convert a5, convert a6, convert a7, convert a8, convert a9, convert a10, convert a11, convert a12, convert a13, convert a14, convert a15, convert a16, convert a17, convert a18, convert a19, convert a20, convert a21, convert a22, convert a23, convert a24, convert a25, convert a26, convert a27, convert a28, convert a29, convert a30, convert a31, convert a32, convert a33, convert a34, convert a35, convert a36, convert a37, convert a38, convert a39)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4, Convertible a5 b5, Convertible a6 b6, Convertible a7 b7, Convertible a8 b8, Convertible a9 b9, Convertible a10 b10, Convertible a11 b11, Convertible a12 b12, Convertible a13 b13, Convertible a14 b14, Convertible a15 b15, Convertible a16 b16, Convertible a17 b17, Convertible a18 b18, Convertible a19 b19, Convertible a20 b20, Convertible a21 b21, Convertible a22 b22, Convertible a23 b23, Convertible a24 b24, Convertible a25 b25, Convertible a26 b26, Convertible a27 b27, Convertible a28 b28, Convertible a29 b29, Convertible a30 b30, Convertible a31 b31, Convertible a32 b32, Convertible a33 b33, Convertible a34 b34, Convertible a35 b35, Convertible a36 b36, Convertible a37 b37, Convertible a38 b38, Convertible a39 b39, Convertible a40 b40) => Convertible (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40) (b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b22,b23,b24,b25,b26,b27,b28,b29,b30,b31,b32,b33,b34,b35,b36,b37,b38,b39,b40) where convert (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40) = (convert a1, convert a2, convert a3, convert a4, convert a5, convert a6, convert a7, convert a8, convert a9, convert a10, convert a11, convert a12, convert a13, convert a14, convert a15, convert a16, convert a17, convert a18, convert a19, convert a20, convert a21, convert a22, convert a23, convert a24, convert a25, convert a26, convert a27, convert a28, convert a29, convert a30, convert a31, convert a32, convert a33, convert a34, convert a35, convert a36, convert a37, convert a38, convert a39, convert a40)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4, Convertible a5 b5, Convertible a6 b6, Convertible a7 b7, Convertible a8 b8, Convertible a9 b9, Convertible a10 b10, Convertible a11 b11, Convertible a12 b12, Convertible a13 b13, Convertible a14 b14, Convertible a15 b15, Convertible a16 b16, Convertible a17 b17, Convertible a18 b18, Convertible a19 b19, Convertible a20 b20, Convertible a21 b21, Convertible a22 b22, Convertible a23 b23, Convertible a24 b24, Convertible a25 b25, Convertible a26 b26, Convertible a27 b27, Convertible a28 b28, Convertible a29 b29, Convertible a30 b30, Convertible a31 b31, Convertible a32 b32, Convertible a33 b33, Convertible a34 b34, Convertible a35 b35, Convertible a36 b36, Convertible a37 b37, Convertible a38 b38, Convertible a39 b39, Convertible a40 b40, Convertible a41 b41) => Convertible (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41) (b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b22,b23,b24,b25,b26,b27,b28,b29,b30,b31,b32,b33,b34,b35,b36,b37,b38,b39,b40,b41) where convert (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41) = (convert a1, convert a2, convert a3, convert a4, convert a5, convert a6, convert a7, convert a8, convert a9, convert a10, convert a11, convert a12, convert a13, convert a14, convert a15, convert a16, convert a17, convert a18, convert a19, convert a20, convert a21, convert a22, convert a23, convert a24, convert a25, convert a26, convert a27, convert a28, convert a29, convert a30, convert a31, convert a32, convert a33, convert a34, convert a35, convert a36, convert a37, convert a38, convert a39, convert a40, convert a41)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4, Convertible a5 b5, Convertible a6 b6, Convertible a7 b7, Convertible a8 b8, Convertible a9 b9, Convertible a10 b10, Convertible a11 b11, Convertible a12 b12, Convertible a13 b13, Convertible a14 b14, Convertible a15 b15, Convertible a16 b16, Convertible a17 b17, Convertible a18 b18, Convertible a19 b19, Convertible a20 b20, Convertible a21 b21, Convertible a22 b22, Convertible a23 b23, Convertible a24 b24, Convertible a25 b25, Convertible a26 b26, Convertible a27 b27, Convertible a28 b28, Convertible a29 b29, Convertible a30 b30, Convertible a31 b31, Convertible a32 b32, Convertible a33 b33, Convertible a34 b34, Convertible a35 b35, Convertible a36 b36, Convertible a37 b37, Convertible a38 b38, Convertible a39 b39, Convertible a40 b40, Convertible a41 b41, Convertible a42 b42) => Convertible (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) (b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b22,b23,b24,b25,b26,b27,b28,b29,b30,b31,b32,b33,b34,b35,b36,b37,b38,b39,b40,b41,b42) where convert (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42) = (convert a1, convert a2, convert a3, convert a4, convert a5, convert a6, convert a7, convert a8, convert a9, convert a10, convert a11, convert a12, convert a13, convert a14, convert a15, convert a16, convert a17, convert a18, convert a19, convert a20, convert a21, convert a22, convert a23, convert a24, convert a25, convert a26, convert a27, convert a28, convert a29, convert a30, convert a31, convert a32, convert a33, convert a34, convert a35, convert a36, convert a37, convert a38, convert a39, convert a40, convert a41, convert a42)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4, Convertible a5 b5, Convertible a6 b6, Convertible a7 b7, Convertible a8 b8, Convertible a9 b9, Convertible a10 b10, Convertible a11 b11, Convertible a12 b12, Convertible a13 b13, Convertible a14 b14, Convertible a15 b15, Convertible a16 b16, Convertible a17 b17, Convertible a18 b18, Convertible a19 b19, Convertible a20 b20, Convertible a21 b21, Convertible a22 b22, Convertible a23 b23, Convertible a24 b24, Convertible a25 b25, Convertible a26 b26, Convertible a27 b27, Convertible a28 b28, Convertible a29 b29, Convertible a30 b30, Convertible a31 b31, Convertible a32 b32, Convertible a33 b33, Convertible a34 b34, Convertible a35 b35, Convertible a36 b36, Convertible a37 b37, Convertible a38 b38, Convertible a39 b39, Convertible a40 b40, Convertible a41 b41, Convertible a42 b42, Convertible a43 b43) => Convertible (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42,a43) (b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b22,b23,b24,b25,b26,b27,b28,b29,b30,b31,b32,b33,b34,b35,b36,b37,b38,b39,b40,b41,b42,b43) where convert (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42,a43) = (convert a1, convert a2, convert a3, convert a4, convert a5, convert a6, convert a7, convert a8, convert a9, convert a10, convert a11, convert a12, convert a13, convert a14, convert a15, convert a16, convert a17, convert a18, convert a19, convert a20, convert a21, convert a22, convert a23, convert a24, convert a25, convert a26, convert a27, convert a28, convert a29, convert a30, convert a31, convert a32, convert a33, convert a34, convert a35, convert a36, convert a37, convert a38, convert a39, convert a40, convert a41, convert a42, convert a43)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4, Convertible a5 b5, Convertible a6 b6, Convertible a7 b7, Convertible a8 b8, Convertible a9 b9, Convertible a10 b10, Convertible a11 b11, Convertible a12 b12, Convertible a13 b13, Convertible a14 b14, Convertible a15 b15, Convertible a16 b16, Convertible a17 b17, Convertible a18 b18, Convertible a19 b19, Convertible a20 b20, Convertible a21 b21, Convertible a22 b22, Convertible a23 b23, Convertible a24 b24, Convertible a25 b25, Convertible a26 b26, Convertible a27 b27, Convertible a28 b28, Convertible a29 b29, Convertible a30 b30, Convertible a31 b31, Convertible a32 b32, Convertible a33 b33, Convertible a34 b34, Convertible a35 b35, Convertible a36 b36, Convertible a37 b37, Convertible a38 b38, Convertible a39 b39, Convertible a40 b40, Convertible a41 b41, Convertible a42 b42, Convertible a43 b43, Convertible a44 b44) => Convertible (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42,a43,a44) (b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b22,b23,b24,b25,b26,b27,b28,b29,b30,b31,b32,b33,b34,b35,b36,b37,b38,b39,b40,b41,b42,b43,b44) where convert (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42,a43,a44) = (convert a1, convert a2, convert a3, convert a4, convert a5, convert a6, convert a7, convert a8, convert a9, convert a10, convert a11, convert a12, convert a13, convert a14, convert a15, convert a16, convert a17, convert a18, convert a19, convert a20, convert a21, convert a22, convert a23, convert a24, convert a25, convert a26, convert a27, convert a28, convert a29, convert a30, convert a31, convert a32, convert a33, convert a34, convert a35, convert a36, convert a37, convert a38, convert a39, convert a40, convert a41, convert a42, convert a43, convert a44)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4, Convertible a5 b5, Convertible a6 b6, Convertible a7 b7, Convertible a8 b8, Convertible a9 b9, Convertible a10 b10, Convertible a11 b11, Convertible a12 b12, Convertible a13 b13, Convertible a14 b14, Convertible a15 b15, Convertible a16 b16, Convertible a17 b17, Convertible a18 b18, Convertible a19 b19, Convertible a20 b20, Convertible a21 b21, Convertible a22 b22, Convertible a23 b23, Convertible a24 b24, Convertible a25 b25, Convertible a26 b26, Convertible a27 b27, Convertible a28 b28, Convertible a29 b29, Convertible a30 b30, Convertible a31 b31, Convertible a32 b32, Convertible a33 b33, Convertible a34 b34, Convertible a35 b35, Convertible a36 b36, Convertible a37 b37, Convertible a38 b38, Convertible a39 b39, Convertible a40 b40, Convertible a41 b41, Convertible a42 b42, Convertible a43 b43, Convertible a44 b44, Convertible a45 b45) => Convertible (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42,a43,a44,a45) (b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b22,b23,b24,b25,b26,b27,b28,b29,b30,b31,b32,b33,b34,b35,b36,b37,b38,b39,b40,b41,b42,b43,b44,b45) where convert (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42,a43,a44,a45) = (convert a1, convert a2, convert a3, convert a4, convert a5, convert a6, convert a7, convert a8, convert a9, convert a10, convert a11, convert a12, convert a13, convert a14, convert a15, convert a16, convert a17, convert a18, convert a19, convert a20, convert a21, convert a22, convert a23, convert a24, convert a25, convert a26, convert a27, convert a28, convert a29, convert a30, convert a31, convert a32, convert a33, convert a34, convert a35, convert a36, convert a37, convert a38, convert a39, convert a40, convert a41, convert a42, convert a43, convert a44, convert a45)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4, Convertible a5 b5, Convertible a6 b6, Convertible a7 b7, Convertible a8 b8, Convertible a9 b9, Convertible a10 b10, Convertible a11 b11, Convertible a12 b12, Convertible a13 b13, Convertible a14 b14, Convertible a15 b15, Convertible a16 b16, Convertible a17 b17, Convertible a18 b18, Convertible a19 b19, Convertible a20 b20, Convertible a21 b21, Convertible a22 b22, Convertible a23 b23, Convertible a24 b24, Convertible a25 b25, Convertible a26 b26, Convertible a27 b27, Convertible a28 b28, Convertible a29 b29, Convertible a30 b30, Convertible a31 b31, Convertible a32 b32, Convertible a33 b33, Convertible a34 b34, Convertible a35 b35, Convertible a36 b36, Convertible a37 b37, Convertible a38 b38, Convertible a39 b39, Convertible a40 b40, Convertible a41 b41, Convertible a42 b42, Convertible a43 b43, Convertible a44 b44, Convertible a45 b45, Convertible a46 b46) => Convertible (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42,a43,a44,a45,a46) (b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b22,b23,b24,b25,b26,b27,b28,b29,b30,b31,b32,b33,b34,b35,b36,b37,b38,b39,b40,b41,b42,b43,b44,b45,b46) where convert (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42,a43,a44,a45,a46) = (convert a1, convert a2, convert a3, convert a4, convert a5, convert a6, convert a7, convert a8, convert a9, convert a10, convert a11, convert a12, convert a13, convert a14, convert a15, convert a16, convert a17, convert a18, convert a19, convert a20, convert a21, convert a22, convert a23, convert a24, convert a25, convert a26, convert a27, convert a28, convert a29, convert a30, convert a31, convert a32, convert a33, convert a34, convert a35, convert a36, convert a37, convert a38, convert a39, convert a40, convert a41, convert a42, convert a43, convert a44, convert a45, convert a46)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4, Convertible a5 b5, Convertible a6 b6, Convertible a7 b7, Convertible a8 b8, Convertible a9 b9, Convertible a10 b10, Convertible a11 b11, Convertible a12 b12, Convertible a13 b13, Convertible a14 b14, Convertible a15 b15, Convertible a16 b16, Convertible a17 b17, Convertible a18 b18, Convertible a19 b19, Convertible a20 b20, Convertible a21 b21, Convertible a22 b22, Convertible a23 b23, Convertible a24 b24, Convertible a25 b25, Convertible a26 b26, Convertible a27 b27, Convertible a28 b28, Convertible a29 b29, Convertible a30 b30, Convertible a31 b31, Convertible a32 b32, Convertible a33 b33, Convertible a34 b34, Convertible a35 b35, Convertible a36 b36, Convertible a37 b37, Convertible a38 b38, Convertible a39 b39, Convertible a40 b40, Convertible a41 b41, Convertible a42 b42, Convertible a43 b43, Convertible a44 b44, Convertible a45 b45, Convertible a46 b46, Convertible a47 b47) => Convertible (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42,a43,a44,a45,a46,a47) (b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b22,b23,b24,b25,b26,b27,b28,b29,b30,b31,b32,b33,b34,b35,b36,b37,b38,b39,b40,b41,b42,b43,b44,b45,b46,b47) where convert (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42,a43,a44,a45,a46,a47) = (convert a1, convert a2, convert a3, convert a4, convert a5, convert a6, convert a7, convert a8, convert a9, convert a10, convert a11, convert a12, convert a13, convert a14, convert a15, convert a16, convert a17, convert a18, convert a19, convert a20, convert a21, convert a22, convert a23, convert a24, convert a25, convert a26, convert a27, convert a28, convert a29, convert a30, convert a31, convert a32, convert a33, convert a34, convert a35, convert a36, convert a37, convert a38, convert a39, convert a40, convert a41, convert a42, convert a43, convert a44, convert a45, convert a46, convert a47)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4, Convertible a5 b5, Convertible a6 b6, Convertible a7 b7, Convertible a8 b8, Convertible a9 b9, Convertible a10 b10, Convertible a11 b11, Convertible a12 b12, Convertible a13 b13, Convertible a14 b14, Convertible a15 b15, Convertible a16 b16, Convertible a17 b17, Convertible a18 b18, Convertible a19 b19, Convertible a20 b20, Convertible a21 b21, Convertible a22 b22, Convertible a23 b23, Convertible a24 b24, Convertible a25 b25, Convertible a26 b26, Convertible a27 b27, Convertible a28 b28, Convertible a29 b29, Convertible a30 b30, Convertible a31 b31, Convertible a32 b32, Convertible a33 b33, Convertible a34 b34, Convertible a35 b35, Convertible a36 b36, Convertible a37 b37, Convertible a38 b38, Convertible a39 b39, Convertible a40 b40, Convertible a41 b41, Convertible a42 b42, Convertible a43 b43, Convertible a44 b44, Convertible a45 b45, Convertible a46 b46, Convertible a47 b47, Convertible a48 b48) => Convertible (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42,a43,a44,a45,a46,a47,a48) (b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b22,b23,b24,b25,b26,b27,b28,b29,b30,b31,b32,b33,b34,b35,b36,b37,b38,b39,b40,b41,b42,b43,b44,b45,b46,b47,b48) where convert (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42,a43,a44,a45,a46,a47,a48) = (convert a1, convert a2, convert a3, convert a4, convert a5, convert a6, convert a7, convert a8, convert a9, convert a10, convert a11, convert a12, convert a13, convert a14, convert a15, convert a16, convert a17, convert a18, convert a19, convert a20, convert a21, convert a22, convert a23, convert a24, convert a25, convert a26, convert a27, convert a28, convert a29, convert a30, convert a31, convert a32, convert a33, convert a34, convert a35, convert a36, convert a37, convert a38, convert a39, convert a40, convert a41, convert a42, convert a43, convert a44, convert a45, convert a46, convert a47, convert a48)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4, Convertible a5 b5, Convertible a6 b6, Convertible a7 b7, Convertible a8 b8, Convertible a9 b9, Convertible a10 b10, Convertible a11 b11, Convertible a12 b12, Convertible a13 b13, Convertible a14 b14, Convertible a15 b15, Convertible a16 b16, Convertible a17 b17, Convertible a18 b18, Convertible a19 b19, Convertible a20 b20, Convertible a21 b21, Convertible a22 b22, Convertible a23 b23, Convertible a24 b24, Convertible a25 b25, Convertible a26 b26, Convertible a27 b27, Convertible a28 b28, Convertible a29 b29, Convertible a30 b30, Convertible a31 b31, Convertible a32 b32, Convertible a33 b33, Convertible a34 b34, Convertible a35 b35, Convertible a36 b36, Convertible a37 b37, Convertible a38 b38, Convertible a39 b39, Convertible a40 b40, Convertible a41 b41, Convertible a42 b42, Convertible a43 b43, Convertible a44 b44, Convertible a45 b45, Convertible a46 b46, Convertible a47 b47, Convertible a48 b48, Convertible a49 b49) => Convertible (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42,a43,a44,a45,a46,a47,a48,a49) (b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b22,b23,b24,b25,b26,b27,b28,b29,b30,b31,b32,b33,b34,b35,b36,b37,b38,b39,b40,b41,b42,b43,b44,b45,b46,b47,b48,b49) where convert (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42,a43,a44,a45,a46,a47,a48,a49) = (convert a1, convert a2, convert a3, convert a4, convert a5, convert a6, convert a7, convert a8, convert a9, convert a10, convert a11, convert a12, convert a13, convert a14, convert a15, convert a16, convert a17, convert a18, convert a19, convert a20, convert a21, convert a22, convert a23, convert a24, convert a25, convert a26, convert a27, convert a28, convert a29, convert a30, convert a31, convert a32, convert a33, convert a34, convert a35, convert a36, convert a37, convert a38, convert a39, convert a40, convert a41, convert a42, convert a43, convert a44, convert a45, convert a46, convert a47, convert a48, convert a49)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4, Convertible a5 b5, Convertible a6 b6, Convertible a7 b7, Convertible a8 b8, Convertible a9 b9, Convertible a10 b10, Convertible a11 b11, Convertible a12 b12, Convertible a13 b13, Convertible a14 b14, Convertible a15 b15, Convertible a16 b16, Convertible a17 b17, Convertible a18 b18, Convertible a19 b19, Convertible a20 b20, Convertible a21 b21, Convertible a22 b22, Convertible a23 b23, Convertible a24 b24, Convertible a25 b25, Convertible a26 b26, Convertible a27 b27, Convertible a28 b28, Convertible a29 b29, Convertible a30 b30, Convertible a31 b31, Convertible a32 b32, Convertible a33 b33, Convertible a34 b34, Convertible a35 b35, Convertible a36 b36, Convertible a37 b37, Convertible a38 b38, Convertible a39 b39, Convertible a40 b40, Convertible a41 b41, Convertible a42 b42, Convertible a43 b43, Convertible a44 b44, Convertible a45 b45, Convertible a46 b46, Convertible a47 b47, Convertible a48 b48, Convertible a49 b49, Convertible a50 b50) => Convertible (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42,a43,a44,a45,a46,a47,a48,a49,a50) (b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b22,b23,b24,b25,b26,b27,b28,b29,b30,b31,b32,b33,b34,b35,b36,b37,b38,b39,b40,b41,b42,b43,b44,b45,b46,b47,b48,b49,b50) where convert (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42,a43,a44,a45,a46,a47,a48,a49,a50) = (convert a1, convert a2, convert a3, convert a4, convert a5, convert a6, convert a7, convert a8, convert a9, convert a10, convert a11, convert a12, convert a13, convert a14, convert a15, convert a16, convert a17, convert a18, convert a19, convert a20, convert a21, convert a22, convert a23, convert a24, convert a25, convert a26, convert a27, convert a28, convert a29, convert a30, convert a31, convert a32, convert a33, convert a34, convert a35, convert a36, convert a37, convert a38, convert a39, convert a40, convert a41, convert a42, convert a43, convert a44, convert a45, convert a46, convert a47, convert a48, convert a49, convert a50)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4, Convertible a5 b5, Convertible a6 b6, Convertible a7 b7, Convertible a8 b8, Convertible a9 b9, Convertible a10 b10, Convertible a11 b11, Convertible a12 b12, Convertible a13 b13, Convertible a14 b14, Convertible a15 b15, Convertible a16 b16, Convertible a17 b17, Convertible a18 b18, Convertible a19 b19, Convertible a20 b20, Convertible a21 b21, Convertible a22 b22, Convertible a23 b23, Convertible a24 b24, Convertible a25 b25, Convertible a26 b26, Convertible a27 b27, Convertible a28 b28, Convertible a29 b29, Convertible a30 b30, Convertible a31 b31, Convertible a32 b32, Convertible a33 b33, Convertible a34 b34, Convertible a35 b35, Convertible a36 b36, Convertible a37 b37, Convertible a38 b38, Convertible a39 b39, Convertible a40 b40, Convertible a41 b41, Convertible a42 b42, Convertible a43 b43, Convertible a44 b44, Convertible a45 b45, Convertible a46 b46, Convertible a47 b47, Convertible a48 b48, Convertible a49 b49, Convertible a50 b50, Convertible a51 b51) => Convertible (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42,a43,a44,a45,a46,a47,a48,a49,a50,a51) (b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b22,b23,b24,b25,b26,b27,b28,b29,b30,b31,b32,b33,b34,b35,b36,b37,b38,b39,b40,b41,b42,b43,b44,b45,b46,b47,b48,b49,b50,b51) where convert (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42,a43,a44,a45,a46,a47,a48,a49,a50,a51) = (convert a1, convert a2, convert a3, convert a4, convert a5, convert a6, convert a7, convert a8, convert a9, convert a10, convert a11, convert a12, convert a13, convert a14, convert a15, convert a16, convert a17, convert a18, convert a19, convert a20, convert a21, convert a22, convert a23, convert a24, convert a25, convert a26, convert a27, convert a28, convert a29, convert a30, convert a31, convert a32, convert a33, convert a34, convert a35, convert a36, convert a37, convert a38, convert a39, convert a40, convert a41, convert a42, convert a43, convert a44, convert a45, convert a46, convert a47, convert a48, convert a49, convert a50, convert a51)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4, Convertible a5 b5, Convertible a6 b6, Convertible a7 b7, Convertible a8 b8, Convertible a9 b9, Convertible a10 b10, Convertible a11 b11, Convertible a12 b12, Convertible a13 b13, Convertible a14 b14, Convertible a15 b15, Convertible a16 b16, Convertible a17 b17, Convertible a18 b18, Convertible a19 b19, Convertible a20 b20, Convertible a21 b21, Convertible a22 b22, Convertible a23 b23, Convertible a24 b24, Convertible a25 b25, Convertible a26 b26, Convertible a27 b27, Convertible a28 b28, Convertible a29 b29, Convertible a30 b30, Convertible a31 b31, Convertible a32 b32, Convertible a33 b33, Convertible a34 b34, Convertible a35 b35, Convertible a36 b36, Convertible a37 b37, Convertible a38 b38, Convertible a39 b39, Convertible a40 b40, Convertible a41 b41, Convertible a42 b42, Convertible a43 b43, Convertible a44 b44, Convertible a45 b45, Convertible a46 b46, Convertible a47 b47, Convertible a48 b48, Convertible a49 b49, Convertible a50 b50, Convertible a51 b51, Convertible a52 b52) => Convertible (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42,a43,a44,a45,a46,a47,a48,a49,a50,a51,a52) (b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b22,b23,b24,b25,b26,b27,b28,b29,b30,b31,b32,b33,b34,b35,b36,b37,b38,b39,b40,b41,b42,b43,b44,b45,b46,b47,b48,b49,b50,b51,b52) where convert (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42,a43,a44,a45,a46,a47,a48,a49,a50,a51,a52) = (convert a1, convert a2, convert a3, convert a4, convert a5, convert a6, convert a7, convert a8, convert a9, convert a10, convert a11, convert a12, convert a13, convert a14, convert a15, convert a16, convert a17, convert a18, convert a19, convert a20, convert a21, convert a22, convert a23, convert a24, convert a25, convert a26, convert a27, convert a28, convert a29, convert a30, convert a31, convert a32, convert a33, convert a34, convert a35, convert a36, convert a37, convert a38, convert a39, convert a40, convert a41, convert a42, convert a43, convert a44, convert a45, convert a46, convert a47, convert a48, convert a49, convert a50, convert a51, convert a52)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4, Convertible a5 b5, Convertible a6 b6, Convertible a7 b7, Convertible a8 b8, Convertible a9 b9, Convertible a10 b10, Convertible a11 b11, Convertible a12 b12, Convertible a13 b13, Convertible a14 b14, Convertible a15 b15, Convertible a16 b16, Convertible a17 b17, Convertible a18 b18, Convertible a19 b19, Convertible a20 b20, Convertible a21 b21, Convertible a22 b22, Convertible a23 b23, Convertible a24 b24, Convertible a25 b25, Convertible a26 b26, Convertible a27 b27, Convertible a28 b28, Convertible a29 b29, Convertible a30 b30, Convertible a31 b31, Convertible a32 b32, Convertible a33 b33, Convertible a34 b34, Convertible a35 b35, Convertible a36 b36, Convertible a37 b37, Convertible a38 b38, Convertible a39 b39, Convertible a40 b40, Convertible a41 b41, Convertible a42 b42, Convertible a43 b43, Convertible a44 b44, Convertible a45 b45, Convertible a46 b46, Convertible a47 b47, Convertible a48 b48, Convertible a49 b49, Convertible a50 b50, Convertible a51 b51, Convertible a52 b52, Convertible a53 b53) => Convertible (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42,a43,a44,a45,a46,a47,a48,a49,a50,a51,a52,a53) (b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b22,b23,b24,b25,b26,b27,b28,b29,b30,b31,b32,b33,b34,b35,b36,b37,b38,b39,b40,b41,b42,b43,b44,b45,b46,b47,b48,b49,b50,b51,b52,b53) where convert (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42,a43,a44,a45,a46,a47,a48,a49,a50,a51,a52,a53) = (convert a1, convert a2, convert a3, convert a4, convert a5, convert a6, convert a7, convert a8, convert a9, convert a10, convert a11, convert a12, convert a13, convert a14, convert a15, convert a16, convert a17, convert a18, convert a19, convert a20, convert a21, convert a22, convert a23, convert a24, convert a25, convert a26, convert a27, convert a28, convert a29, convert a30, convert a31, convert a32, convert a33, convert a34, convert a35, convert a36, convert a37, convert a38, convert a39, convert a40, convert a41, convert a42, convert a43, convert a44, convert a45, convert a46, convert a47, convert a48, convert a49, convert a50, convert a51, convert a52, convert a53)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4, Convertible a5 b5, Convertible a6 b6, Convertible a7 b7, Convertible a8 b8, Convertible a9 b9, Convertible a10 b10, Convertible a11 b11, Convertible a12 b12, Convertible a13 b13, Convertible a14 b14, Convertible a15 b15, Convertible a16 b16, Convertible a17 b17, Convertible a18 b18, Convertible a19 b19, Convertible a20 b20, Convertible a21 b21, Convertible a22 b22, Convertible a23 b23, Convertible a24 b24, Convertible a25 b25, Convertible a26 b26, Convertible a27 b27, Convertible a28 b28, Convertible a29 b29, Convertible a30 b30, Convertible a31 b31, Convertible a32 b32, Convertible a33 b33, Convertible a34 b34, Convertible a35 b35, Convertible a36 b36, Convertible a37 b37, Convertible a38 b38, Convertible a39 b39, Convertible a40 b40, Convertible a41 b41, Convertible a42 b42, Convertible a43 b43, Convertible a44 b44, Convertible a45 b45, Convertible a46 b46, Convertible a47 b47, Convertible a48 b48, Convertible a49 b49, Convertible a50 b50, Convertible a51 b51, Convertible a52 b52, Convertible a53 b53, Convertible a54 b54) => Convertible (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42,a43,a44,a45,a46,a47,a48,a49,a50,a51,a52,a53,a54) (b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b22,b23,b24,b25,b26,b27,b28,b29,b30,b31,b32,b33,b34,b35,b36,b37,b38,b39,b40,b41,b42,b43,b44,b45,b46,b47,b48,b49,b50,b51,b52,b53,b54) where convert (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42,a43,a44,a45,a46,a47,a48,a49,a50,a51,a52,a53,a54) = (convert a1, convert a2, convert a3, convert a4, convert a5, convert a6, convert a7, convert a8, convert a9, convert a10, convert a11, convert a12, convert a13, convert a14, convert a15, convert a16, convert a17, convert a18, convert a19, convert a20, convert a21, convert a22, convert a23, convert a24, convert a25, convert a26, convert a27, convert a28, convert a29, convert a30, convert a31, convert a32, convert a33, convert a34, convert a35, convert a36, convert a37, convert a38, convert a39, convert a40, convert a41, convert a42, convert a43, convert a44, convert a45, convert a46, convert a47, convert a48, convert a49, convert a50, convert a51, convert a52, convert a53, convert a54)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4, Convertible a5 b5, Convertible a6 b6, Convertible a7 b7, Convertible a8 b8, Convertible a9 b9, Convertible a10 b10, Convertible a11 b11, Convertible a12 b12, Convertible a13 b13, Convertible a14 b14, Convertible a15 b15, Convertible a16 b16, Convertible a17 b17, Convertible a18 b18, Convertible a19 b19, Convertible a20 b20, Convertible a21 b21, Convertible a22 b22, Convertible a23 b23, Convertible a24 b24, Convertible a25 b25, Convertible a26 b26, Convertible a27 b27, Convertible a28 b28, Convertible a29 b29, Convertible a30 b30, Convertible a31 b31, Convertible a32 b32, Convertible a33 b33, Convertible a34 b34, Convertible a35 b35, Convertible a36 b36, Convertible a37 b37, Convertible a38 b38, Convertible a39 b39, Convertible a40 b40, Convertible a41 b41, Convertible a42 b42, Convertible a43 b43, Convertible a44 b44, Convertible a45 b45, Convertible a46 b46, Convertible a47 b47, Convertible a48 b48, Convertible a49 b49, Convertible a50 b50, Convertible a51 b51, Convertible a52 b52, Convertible a53 b53, Convertible a54 b54, Convertible a55 b55) => Convertible (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42,a43,a44,a45,a46,a47,a48,a49,a50,a51,a52,a53,a54,a55) (b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b22,b23,b24,b25,b26,b27,b28,b29,b30,b31,b32,b33,b34,b35,b36,b37,b38,b39,b40,b41,b42,b43,b44,b45,b46,b47,b48,b49,b50,b51,b52,b53,b54,b55) where convert (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42,a43,a44,a45,a46,a47,a48,a49,a50,a51,a52,a53,a54,a55) = (convert a1, convert a2, convert a3, convert a4, convert a5, convert a6, convert a7, convert a8, convert a9, convert a10, convert a11, convert a12, convert a13, convert a14, convert a15, convert a16, convert a17, convert a18, convert a19, convert a20, convert a21, convert a22, convert a23, convert a24, convert a25, convert a26, convert a27, convert a28, convert a29, convert a30, convert a31, convert a32, convert a33, convert a34, convert a35, convert a36, convert a37, convert a38, convert a39, convert a40, convert a41, convert a42, convert a43, convert a44, convert a45, convert a46, convert a47, convert a48, convert a49, convert a50, convert a51, convert a52, convert a53, convert a54, convert a55)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4, Convertible a5 b5, Convertible a6 b6, Convertible a7 b7, Convertible a8 b8, Convertible a9 b9, Convertible a10 b10, Convertible a11 b11, Convertible a12 b12, Convertible a13 b13, Convertible a14 b14, Convertible a15 b15, Convertible a16 b16, Convertible a17 b17, Convertible a18 b18, Convertible a19 b19, Convertible a20 b20, Convertible a21 b21, Convertible a22 b22, Convertible a23 b23, Convertible a24 b24, Convertible a25 b25, Convertible a26 b26, Convertible a27 b27, Convertible a28 b28, Convertible a29 b29, Convertible a30 b30, Convertible a31 b31, Convertible a32 b32, Convertible a33 b33, Convertible a34 b34, Convertible a35 b35, Convertible a36 b36, Convertible a37 b37, Convertible a38 b38, Convertible a39 b39, Convertible a40 b40, Convertible a41 b41, Convertible a42 b42, Convertible a43 b43, Convertible a44 b44, Convertible a45 b45, Convertible a46 b46, Convertible a47 b47, Convertible a48 b48, Convertible a49 b49, Convertible a50 b50, Convertible a51 b51, Convertible a52 b52, Convertible a53 b53, Convertible a54 b54, Convertible a55 b55, Convertible a56 b56) => Convertible (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42,a43,a44,a45,a46,a47,a48,a49,a50,a51,a52,a53,a54,a55,a56) (b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b22,b23,b24,b25,b26,b27,b28,b29,b30,b31,b32,b33,b34,b35,b36,b37,b38,b39,b40,b41,b42,b43,b44,b45,b46,b47,b48,b49,b50,b51,b52,b53,b54,b55,b56) where convert (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42,a43,a44,a45,a46,a47,a48,a49,a50,a51,a52,a53,a54,a55,a56) = (convert a1, convert a2, convert a3, convert a4, convert a5, convert a6, convert a7, convert a8, convert a9, convert a10, convert a11, convert a12, convert a13, convert a14, convert a15, convert a16, convert a17, convert a18, convert a19, convert a20, convert a21, convert a22, convert a23, convert a24, convert a25, convert a26, convert a27, convert a28, convert a29, convert a30, convert a31, convert a32, convert a33, convert a34, convert a35, convert a36, convert a37, convert a38, convert a39, convert a40, convert a41, convert a42, convert a43, convert a44, convert a45, convert a46, convert a47, convert a48, convert a49, convert a50, convert a51, convert a52, convert a53, convert a54, convert a55, convert a56)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4, Convertible a5 b5, Convertible a6 b6, Convertible a7 b7, Convertible a8 b8, Convertible a9 b9, Convertible a10 b10, Convertible a11 b11, Convertible a12 b12, Convertible a13 b13, Convertible a14 b14, Convertible a15 b15, Convertible a16 b16, Convertible a17 b17, Convertible a18 b18, Convertible a19 b19, Convertible a20 b20, Convertible a21 b21, Convertible a22 b22, Convertible a23 b23, Convertible a24 b24, Convertible a25 b25, Convertible a26 b26, Convertible a27 b27, Convertible a28 b28, Convertible a29 b29, Convertible a30 b30, Convertible a31 b31, Convertible a32 b32, Convertible a33 b33, Convertible a34 b34, Convertible a35 b35, Convertible a36 b36, Convertible a37 b37, Convertible a38 b38, Convertible a39 b39, Convertible a40 b40, Convertible a41 b41, Convertible a42 b42, Convertible a43 b43, Convertible a44 b44, Convertible a45 b45, Convertible a46 b46, Convertible a47 b47, Convertible a48 b48, Convertible a49 b49, Convertible a50 b50, Convertible a51 b51, Convertible a52 b52, Convertible a53 b53, Convertible a54 b54, Convertible a55 b55, Convertible a56 b56, Convertible a57 b57) => Convertible (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42,a43,a44,a45,a46,a47,a48,a49,a50,a51,a52,a53,a54,a55,a56,a57) (b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b22,b23,b24,b25,b26,b27,b28,b29,b30,b31,b32,b33,b34,b35,b36,b37,b38,b39,b40,b41,b42,b43,b44,b45,b46,b47,b48,b49,b50,b51,b52,b53,b54,b55,b56,b57) where convert (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42,a43,a44,a45,a46,a47,a48,a49,a50,a51,a52,a53,a54,a55,a56,a57) = (convert a1, convert a2, convert a3, convert a4, convert a5, convert a6, convert a7, convert a8, convert a9, convert a10, convert a11, convert a12, convert a13, convert a14, convert a15, convert a16, convert a17, convert a18, convert a19, convert a20, convert a21, convert a22, convert a23, convert a24, convert a25, convert a26, convert a27, convert a28, convert a29, convert a30, convert a31, convert a32, convert a33, convert a34, convert a35, convert a36, convert a37, convert a38, convert a39, convert a40, convert a41, convert a42, convert a43, convert a44, convert a45, convert a46, convert a47, convert a48, convert a49, convert a50, convert a51, convert a52, convert a53, convert a54, convert a55, convert a56, convert a57)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4, Convertible a5 b5, Convertible a6 b6, Convertible a7 b7, Convertible a8 b8, Convertible a9 b9, Convertible a10 b10, Convertible a11 b11, Convertible a12 b12, Convertible a13 b13, Convertible a14 b14, Convertible a15 b15, Convertible a16 b16, Convertible a17 b17, Convertible a18 b18, Convertible a19 b19, Convertible a20 b20, Convertible a21 b21, Convertible a22 b22, Convertible a23 b23, Convertible a24 b24, Convertible a25 b25, Convertible a26 b26, Convertible a27 b27, Convertible a28 b28, Convertible a29 b29, Convertible a30 b30, Convertible a31 b31, Convertible a32 b32, Convertible a33 b33, Convertible a34 b34, Convertible a35 b35, Convertible a36 b36, Convertible a37 b37, Convertible a38 b38, Convertible a39 b39, Convertible a40 b40, Convertible a41 b41, Convertible a42 b42, Convertible a43 b43, Convertible a44 b44, Convertible a45 b45, Convertible a46 b46, Convertible a47 b47, Convertible a48 b48, Convertible a49 b49, Convertible a50 b50, Convertible a51 b51, Convertible a52 b52, Convertible a53 b53, Convertible a54 b54, Convertible a55 b55, Convertible a56 b56, Convertible a57 b57, Convertible a58 b58) => Convertible (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42,a43,a44,a45,a46,a47,a48,a49,a50,a51,a52,a53,a54,a55,a56,a57,a58) (b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b22,b23,b24,b25,b26,b27,b28,b29,b30,b31,b32,b33,b34,b35,b36,b37,b38,b39,b40,b41,b42,b43,b44,b45,b46,b47,b48,b49,b50,b51,b52,b53,b54,b55,b56,b57,b58) where convert (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42,a43,a44,a45,a46,a47,a48,a49,a50,a51,a52,a53,a54,a55,a56,a57,a58) = (convert a1, convert a2, convert a3, convert a4, convert a5, convert a6, convert a7, convert a8, convert a9, convert a10, convert a11, convert a12, convert a13, convert a14, convert a15, convert a16, convert a17, convert a18, convert a19, convert a20, convert a21, convert a22, convert a23, convert a24, convert a25, convert a26, convert a27, convert a28, convert a29, convert a30, convert a31, convert a32, convert a33, convert a34, convert a35, convert a36, convert a37, convert a38, convert a39, convert a40, convert a41, convert a42, convert a43, convert a44, convert a45, convert a46, convert a47, convert a48, convert a49, convert a50, convert a51, convert a52, convert a53, convert a54, convert a55, convert a56, convert a57, convert a58)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4, Convertible a5 b5, Convertible a6 b6, Convertible a7 b7, Convertible a8 b8, Convertible a9 b9, Convertible a10 b10, Convertible a11 b11, Convertible a12 b12, Convertible a13 b13, Convertible a14 b14, Convertible a15 b15, Convertible a16 b16, Convertible a17 b17, Convertible a18 b18, Convertible a19 b19, Convertible a20 b20, Convertible a21 b21, Convertible a22 b22, Convertible a23 b23, Convertible a24 b24, Convertible a25 b25, Convertible a26 b26, Convertible a27 b27, Convertible a28 b28, Convertible a29 b29, Convertible a30 b30, Convertible a31 b31, Convertible a32 b32, Convertible a33 b33, Convertible a34 b34, Convertible a35 b35, Convertible a36 b36, Convertible a37 b37, Convertible a38 b38, Convertible a39 b39, Convertible a40 b40, Convertible a41 b41, Convertible a42 b42, Convertible a43 b43, Convertible a44 b44, Convertible a45 b45, Convertible a46 b46, Convertible a47 b47, Convertible a48 b48, Convertible a49 b49, Convertible a50 b50, Convertible a51 b51, Convertible a52 b52, Convertible a53 b53, Convertible a54 b54, Convertible a55 b55, Convertible a56 b56, Convertible a57 b57, Convertible a58 b58, Convertible a59 b59) => Convertible (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42,a43,a44,a45,a46,a47,a48,a49,a50,a51,a52,a53,a54,a55,a56,a57,a58,a59) (b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b22,b23,b24,b25,b26,b27,b28,b29,b30,b31,b32,b33,b34,b35,b36,b37,b38,b39,b40,b41,b42,b43,b44,b45,b46,b47,b48,b49,b50,b51,b52,b53,b54,b55,b56,b57,b58,b59) where convert (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42,a43,a44,a45,a46,a47,a48,a49,a50,a51,a52,a53,a54,a55,a56,a57,a58,a59) = (convert a1, convert a2, convert a3, convert a4, convert a5, convert a6, convert a7, convert a8, convert a9, convert a10, convert a11, convert a12, convert a13, convert a14, convert a15, convert a16, convert a17, convert a18, convert a19, convert a20, convert a21, convert a22, convert a23, convert a24, convert a25, convert a26, convert a27, convert a28, convert a29, convert a30, convert a31, convert a32, convert a33, convert a34, convert a35, convert a36, convert a37, convert a38, convert a39, convert a40, convert a41, convert a42, convert a43, convert a44, convert a45, convert a46, convert a47, convert a48, convert a49, convert a50, convert a51, convert a52, convert a53, convert a54, convert a55, convert a56, convert a57, convert a58, convert a59)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4, Convertible a5 b5, Convertible a6 b6, Convertible a7 b7, Convertible a8 b8, Convertible a9 b9, Convertible a10 b10, Convertible a11 b11, Convertible a12 b12, Convertible a13 b13, Convertible a14 b14, Convertible a15 b15, Convertible a16 b16, Convertible a17 b17, Convertible a18 b18, Convertible a19 b19, Convertible a20 b20, Convertible a21 b21, Convertible a22 b22, Convertible a23 b23, Convertible a24 b24, Convertible a25 b25, Convertible a26 b26, Convertible a27 b27, Convertible a28 b28, Convertible a29 b29, Convertible a30 b30, Convertible a31 b31, Convertible a32 b32, Convertible a33 b33, Convertible a34 b34, Convertible a35 b35, Convertible a36 b36, Convertible a37 b37, Convertible a38 b38, Convertible a39 b39, Convertible a40 b40, Convertible a41 b41, Convertible a42 b42, Convertible a43 b43, Convertible a44 b44, Convertible a45 b45, Convertible a46 b46, Convertible a47 b47, Convertible a48 b48, Convertible a49 b49, Convertible a50 b50, Convertible a51 b51, Convertible a52 b52, Convertible a53 b53, Convertible a54 b54, Convertible a55 b55, Convertible a56 b56, Convertible a57 b57, Convertible a58 b58, Convertible a59 b59, Convertible a60 b60) => Convertible (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42,a43,a44,a45,a46,a47,a48,a49,a50,a51,a52,a53,a54,a55,a56,a57,a58,a59,a60) (b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b22,b23,b24,b25,b26,b27,b28,b29,b30,b31,b32,b33,b34,b35,b36,b37,b38,b39,b40,b41,b42,b43,b44,b45,b46,b47,b48,b49,b50,b51,b52,b53,b54,b55,b56,b57,b58,b59,b60) where convert (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42,a43,a44,a45,a46,a47,a48,a49,a50,a51,a52,a53,a54,a55,a56,a57,a58,a59,a60) = (convert a1, convert a2, convert a3, convert a4, convert a5, convert a6, convert a7, convert a8, convert a9, convert a10, convert a11, convert a12, convert a13, convert a14, convert a15, convert a16, convert a17, convert a18, convert a19, convert a20, convert a21, convert a22, convert a23, convert a24, convert a25, convert a26, convert a27, convert a28, convert a29, convert a30, convert a31, convert a32, convert a33, convert a34, convert a35, convert a36, convert a37, convert a38, convert a39, convert a40, convert a41, convert a42, convert a43, convert a44, convert a45, convert a46, convert a47, convert a48, convert a49, convert a50, convert a51, convert a52, convert a53, convert a54, convert a55, convert a56, convert a57, convert a58, convert a59, convert a60)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4, Convertible a5 b5, Convertible a6 b6, Convertible a7 b7, Convertible a8 b8, Convertible a9 b9, Convertible a10 b10, Convertible a11 b11, Convertible a12 b12, Convertible a13 b13, Convertible a14 b14, Convertible a15 b15, Convertible a16 b16, Convertible a17 b17, Convertible a18 b18, Convertible a19 b19, Convertible a20 b20, Convertible a21 b21, Convertible a22 b22, Convertible a23 b23, Convertible a24 b24, Convertible a25 b25, Convertible a26 b26, Convertible a27 b27, Convertible a28 b28, Convertible a29 b29, Convertible a30 b30, Convertible a31 b31, Convertible a32 b32, Convertible a33 b33, Convertible a34 b34, Convertible a35 b35, Convertible a36 b36, Convertible a37 b37, Convertible a38 b38, Convertible a39 b39, Convertible a40 b40, Convertible a41 b41, Convertible a42 b42, Convertible a43 b43, Convertible a44 b44, Convertible a45 b45, Convertible a46 b46, Convertible a47 b47, Convertible a48 b48, Convertible a49 b49, Convertible a50 b50, Convertible a51 b51, Convertible a52 b52, Convertible a53 b53, Convertible a54 b54, Convertible a55 b55, Convertible a56 b56, Convertible a57 b57, Convertible a58 b58, Convertible a59 b59, Convertible a60 b60, Convertible a61 b61) => Convertible (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42,a43,a44,a45,a46,a47,a48,a49,a50,a51,a52,a53,a54,a55,a56,a57,a58,a59,a60,a61) (b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b22,b23,b24,b25,b26,b27,b28,b29,b30,b31,b32,b33,b34,b35,b36,b37,b38,b39,b40,b41,b42,b43,b44,b45,b46,b47,b48,b49,b50,b51,b52,b53,b54,b55,b56,b57,b58,b59,b60,b61) where convert (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42,a43,a44,a45,a46,a47,a48,a49,a50,a51,a52,a53,a54,a55,a56,a57,a58,a59,a60,a61) = (convert a1, convert a2, convert a3, convert a4, convert a5, convert a6, convert a7, convert a8, convert a9, convert a10, convert a11, convert a12, convert a13, convert a14, convert a15, convert a16, convert a17, convert a18, convert a19, convert a20, convert a21, convert a22, convert a23, convert a24, convert a25, convert a26, convert a27, convert a28, convert a29, convert a30, convert a31, convert a32, convert a33, convert a34, convert a35, convert a36, convert a37, convert a38, convert a39, convert a40, convert a41, convert a42, convert a43, convert a44, convert a45, convert a46, convert a47, convert a48, convert a49, convert a50, convert a51, convert a52, convert a53, convert a54, convert a55, convert a56, convert a57, convert a58, convert a59, convert a60, convert a61)+instance (Convertible a1 b1, Convertible a2 b2, Convertible a3 b3, Convertible a4 b4, Convertible a5 b5, Convertible a6 b6, Convertible a7 b7, Convertible a8 b8, Convertible a9 b9, Convertible a10 b10, Convertible a11 b11, Convertible a12 b12, Convertible a13 b13, Convertible a14 b14, Convertible a15 b15, Convertible a16 b16, Convertible a17 b17, Convertible a18 b18, Convertible a19 b19, Convertible a20 b20, Convertible a21 b21, Convertible a22 b22, Convertible a23 b23, Convertible a24 b24, Convertible a25 b25, Convertible a26 b26, Convertible a27 b27, Convertible a28 b28, Convertible a29 b29, Convertible a30 b30, Convertible a31 b31, Convertible a32 b32, Convertible a33 b33, Convertible a34 b34, Convertible a35 b35, Convertible a36 b36, Convertible a37 b37, Convertible a38 b38, Convertible a39 b39, Convertible a40 b40, Convertible a41 b41, Convertible a42 b42, Convertible a43 b43, Convertible a44 b44, Convertible a45 b45, Convertible a46 b46, Convertible a47 b47, Convertible a48 b48, Convertible a49 b49, Convertible a50 b50, Convertible a51 b51, Convertible a52 b52, Convertible a53 b53, Convertible a54 b54, Convertible a55 b55, Convertible a56 b56, Convertible a57 b57, Convertible a58 b58, Convertible a59 b59, Convertible a60 b60, Convertible a61 b61, Convertible a62 b62) => Convertible (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42,a43,a44,a45,a46,a47,a48,a49,a50,a51,a52,a53,a54,a55,a56,a57,a58,a59,a60,a61,a62) (b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b22,b23,b24,b25,b26,b27,b28,b29,b30,b31,b32,b33,b34,b35,b36,b37,b38,b39,b40,b41,b42,b43,b44,b45,b46,b47,b48,b49,b50,b51,b52,b53,b54,b55,b56,b57,b58,b59,b60,b61,b62) where convert (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42,a43,a44,a45,a46,a47,a48,a49,a50,a51,a52,a53,a54,a55,a56,a57,a58,a59,a60,a61,a62) = (convert a1, convert a2, convert a3, convert a4, convert a5, convert a6, convert a7, convert a8, convert a9, convert a10, convert a11, convert a12, convert a13, convert a14, convert a15, convert a16, convert a17, convert a18, convert a19, convert a20, convert a21, convert a22, convert a23, convert a24, convert a25, convert a26, convert a27, convert a28, convert a29, convert a30, convert a31, convert a32, convert a33, convert a34, convert a35, convert a36, convert a37, convert a38, convert a39, convert a40, convert a41, convert a42, convert a43, convert a44, convert a45, convert a46, convert a47, convert a48, convert a49, convert a50, convert a51, convert a52, convert a53, convert a54, convert a55, convert a56, convert a57, convert a58, convert a59, convert a60, convert a61, convert a62)
+ src/Text/PrettyPrint/ANSI/Leijen/Convert.hs view
@@ -0,0 +1,16 @@+{-# LANGUAGE TypeApplications #-}++module Text.PrettyPrint.ANSI.Leijen.Convert where++import Text.PrettyPrint.ANSI.Leijen+import Data.Convert.Class+import Data.Default+import Data.Text+import Data.Convert.Instances.Text++type IsDoc t = Convertible t Doc++instance Default Doc where def = convert "" ; {-# INLINE def #-}++instance Convertible String Doc where convert s = text s ; {-# INLINE convert #-}+instance Convertible Text Doc where convert = convertVia @String ; {-# INLINE convert #-}