Generate Typeable info at definition sites
[ghc.git] / libraries / ghc-prim / GHC / Classes.hs
1 {-# LANGUAGE CPP, Trustworthy #-}
2 {-# LANGUAGE NoImplicitPrelude, MagicHash, StandaloneDeriving, BangPatterns,
3 KindSignatures, DataKinds, ConstraintKinds,
4 MultiParamTypeClasses, FunctionalDependencies #-}
5 {-# LANGUAGE AllowAmbiguousTypes #-}
6 -- ip :: IP x a => a is strictly speaking ambiguous, but IP is magic
7
8 {-# OPTIONS_GHC -fno-warn-unused-imports #-}
9 -- -fno-warn-unused-imports needed for the GHC.Tuple import below. Sigh.
10
11 {-# OPTIONS_GHC -fno-warn-unused-top-binds #-}
12 -- -fno-warn-unused-top-binds is there (I hope) to stop Haddock complaining
13 -- about the constraint tuples being defined but not used
14
15 {-# OPTIONS_HADDOCK hide #-}
16 -----------------------------------------------------------------------------
17 -- |
18 -- Module : GHC.Classes
19 -- Copyright : (c) The University of Glasgow, 1992-2002
20 -- License : see libraries/base/LICENSE
21 --
22 -- Maintainer : cvs-ghc@haskell.org
23 -- Stability : internal
24 -- Portability : non-portable (GHC extensions)
25 --
26 -- Basic classes.
27 --
28 -----------------------------------------------------------------------------
29
30 module GHC.Classes(
31 -- * Implicit paramaters
32 IP(..),
33
34 -- * Equality and ordering
35 Eq(..), eqInt, neInt,
36 Ord(..), gtInt, geInt, leInt, ltInt, compareInt, compareInt#,
37
38 -- * Functions over Bool
39 (&&), (||), not,
40
41 -- * Integer arithmetic
42 divInt#, modInt#
43 ) where
44
45 -- GHC.Magic is used in some derived instances
46 import GHC.Magic ()
47 import GHC.IntWord64
48 import GHC.Prim
49 import GHC.Tuple
50 import GHC.Types
51
52 #include "MachDeps.h"
53
54 infix 4 ==, /=, <, <=, >=, >
55 infixr 3 &&
56 infixr 2 ||
57
58 default () -- Double isn't available yet
59
60 -- | The syntax @?x :: a@ is desugared into @IP "x" a@
61 -- IP is declared very early, so that libraries can take
62 -- advantage of the implicit-call-stack feature
63 class IP (x :: Symbol) a | x -> a where
64 ip :: a
65
66
67 -- | The 'Eq' class defines equality ('==') and inequality ('/=').
68 -- All the basic datatypes exported by the "Prelude" are instances of 'Eq',
69 -- and 'Eq' may be derived for any datatype whose constituents are also
70 -- instances of 'Eq'.
71 --
72 -- Minimal complete definition: either '==' or '/='.
73 --
74 class Eq a where
75 (==), (/=) :: a -> a -> Bool
76
77 {-# INLINE (/=) #-}
78 {-# INLINE (==) #-}
79 x /= y = not (x == y)
80 x == y = not (x /= y)
81 {-# MINIMAL (==) | (/=) #-}
82
83 deriving instance Eq ()
84 deriving instance (Eq a, Eq b) => Eq (a, b)
85 deriving instance (Eq a, Eq b, Eq c) => Eq (a, b, c)
86 deriving instance (Eq a, Eq b, Eq c, Eq d) => Eq (a, b, c, d)
87 deriving instance (Eq a, Eq b, Eq c, Eq d, Eq e) => Eq (a, b, c, d, e)
88 deriving instance (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f)
89 => Eq (a, b, c, d, e, f)
90 deriving instance (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g)
91 => Eq (a, b, c, d, e, f, g)
92 deriving instance (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g,
93 Eq h)
94 => Eq (a, b, c, d, e, f, g, h)
95 deriving instance (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g,
96 Eq h, Eq i)
97 => Eq (a, b, c, d, e, f, g, h, i)
98 deriving instance (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g,
99 Eq h, Eq i, Eq j)
100 => Eq (a, b, c, d, e, f, g, h, i, j)
101 deriving instance (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g,
102 Eq h, Eq i, Eq j, Eq k)
103 => Eq (a, b, c, d, e, f, g, h, i, j, k)
104 deriving instance (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g,
105 Eq h, Eq i, Eq j, Eq k, Eq l)
106 => Eq (a, b, c, d, e, f, g, h, i, j, k, l)
107 deriving instance (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g,
108 Eq h, Eq i, Eq j, Eq k, Eq l, Eq m)
109 => Eq (a, b, c, d, e, f, g, h, i, j, k, l, m)
110 deriving instance (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g,
111 Eq h, Eq i, Eq j, Eq k, Eq l, Eq m, Eq n)
112 => Eq (a, b, c, d, e, f, g, h, i, j, k, l, m, n)
113 deriving instance (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g,
114 Eq h, Eq i, Eq j, Eq k, Eq l, Eq m, Eq n, Eq o)
115 => Eq (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o)
116
117 instance (Eq a) => Eq [a] where
118 {-# SPECIALISE instance Eq [[Char]] #-}
119 {-# SPECIALISE instance Eq [Char] #-}
120 {-# SPECIALISE instance Eq [Int] #-}
121 [] == [] = True
122 (x:xs) == (y:ys) = x == y && xs == ys
123 _xs == _ys = False
124
125 deriving instance Eq Bool
126 deriving instance Eq Ordering
127 deriving instance Eq Word
128
129 instance Eq Char where
130 (C# c1) == (C# c2) = isTrue# (c1 `eqChar#` c2)
131 (C# c1) /= (C# c2) = isTrue# (c1 `neChar#` c2)
132
133 instance Eq Float where
134 (F# x) == (F# y) = isTrue# (x `eqFloat#` y)
135
136 instance Eq Double where
137 (D# x) == (D# y) = isTrue# (x ==## y)
138
139 instance Eq Int where
140 (==) = eqInt
141 (/=) = neInt
142
143 {-# INLINE eqInt #-}
144 {-# INLINE neInt #-}
145 eqInt, neInt :: Int -> Int -> Bool
146 (I# x) `eqInt` (I# y) = isTrue# (x ==# y)
147 (I# x) `neInt` (I# y) = isTrue# (x /=# y)
148
149 #if WORD_SIZE_IN_BITS < 64
150 instance Eq TyCon where
151 (==) (TyCon hi1 lo1 _ _) (TyCon hi2 lo2 _ _)
152 = isTrue# (hi1 `eqWord64#` hi2) && isTrue# (lo1 `eqWord64#` lo2)
153 instance Ord TyCon where
154 compare (TyCon hi1 lo1 _ _) (TyCon hi2 lo2 _ _)
155 | isTrue# (hi1 `gtWord64#` hi2) = GT
156 | isTrue# (hi1 `ltWord64#` hi2) = LT
157 | isTrue# (lo1 `gtWord64#` lo2) = GT
158 | isTrue# (lo1 `ltWord64#` lo2) = LT
159 | True = EQ
160 #else
161 instance Eq TyCon where
162 (==) (TyCon hi1 lo1 _ _) (TyCon hi2 lo2 _ _)
163 = isTrue# (hi1 `eqWord#` hi2) && isTrue# (lo1 `eqWord#` lo2)
164 instance Ord TyCon where
165 compare (TyCon hi1 lo1 _ _) (TyCon hi2 lo2 _ _)
166 | isTrue# (hi1 `gtWord#` hi2) = GT
167 | isTrue# (hi1 `ltWord#` hi2) = LT
168 | isTrue# (lo1 `gtWord#` lo2) = GT
169 | isTrue# (lo1 `ltWord#` lo2) = LT
170 | True = EQ
171 #endif
172
173
174 -- | The 'Ord' class is used for totally ordered datatypes.
175 --
176 -- Instances of 'Ord' can be derived for any user-defined
177 -- datatype whose constituent types are in 'Ord'. The declared order
178 -- of the constructors in the data declaration determines the ordering
179 -- in derived 'Ord' instances. The 'Ordering' datatype allows a single
180 -- comparison to determine the precise ordering of two objects.
181 --
182 -- Minimal complete definition: either 'compare' or '<='.
183 -- Using 'compare' can be more efficient for complex types.
184 --
185 class (Eq a) => Ord a where
186 compare :: a -> a -> Ordering
187 (<), (<=), (>), (>=) :: a -> a -> Bool
188 max, min :: a -> a -> a
189
190 compare x y = if x == y then EQ
191 -- NB: must be '<=' not '<' to validate the
192 -- above claim about the minimal things that
193 -- can be defined for an instance of Ord:
194 else if x <= y then LT
195 else GT
196
197 x < y = case compare x y of { LT -> True; _ -> False }
198 x <= y = case compare x y of { GT -> False; _ -> True }
199 x > y = case compare x y of { GT -> True; _ -> False }
200 x >= y = case compare x y of { LT -> False; _ -> True }
201
202 -- These two default methods use '<=' rather than 'compare'
203 -- because the latter is often more expensive
204 max x y = if x <= y then y else x
205 min x y = if x <= y then x else y
206 {-# MINIMAL compare | (<=) #-}
207
208 deriving instance Ord ()
209 deriving instance (Ord a, Ord b) => Ord (a, b)
210 deriving instance (Ord a, Ord b, Ord c) => Ord (a, b, c)
211 deriving instance (Ord a, Ord b, Ord c, Ord d) => Ord (a, b, c, d)
212 deriving instance (Ord a, Ord b, Ord c, Ord d, Ord e) => Ord (a, b, c, d, e)
213 deriving instance (Ord a, Ord b, Ord c, Ord d, Ord e, Ord f)
214 => Ord (a, b, c, d, e, f)
215 deriving instance (Ord a, Ord b, Ord c, Ord d, Ord e, Ord f, Ord g)
216 => Ord (a, b, c, d, e, f, g)
217 deriving instance (Ord a, Ord b, Ord c, Ord d, Ord e, Ord f, Ord g,
218 Ord h)
219 => Ord (a, b, c, d, e, f, g, h)
220 deriving instance (Ord a, Ord b, Ord c, Ord d, Ord e, Ord f, Ord g,
221 Ord h, Ord i)
222 => Ord (a, b, c, d, e, f, g, h, i)
223 deriving instance (Ord a, Ord b, Ord c, Ord d, Ord e, Ord f, Ord g,
224 Ord h, Ord i, Ord j)
225 => Ord (a, b, c, d, e, f, g, h, i, j)
226 deriving instance (Ord a, Ord b, Ord c, Ord d, Ord e, Ord f, Ord g,
227 Ord h, Ord i, Ord j, Ord k)
228 => Ord (a, b, c, d, e, f, g, h, i, j, k)
229 deriving instance (Ord a, Ord b, Ord c, Ord d, Ord e, Ord f, Ord g,
230 Ord h, Ord i, Ord j, Ord k, Ord l)
231 => Ord (a, b, c, d, e, f, g, h, i, j, k, l)
232 deriving instance (Ord a, Ord b, Ord c, Ord d, Ord e, Ord f, Ord g,
233 Ord h, Ord i, Ord j, Ord k, Ord l, Ord m)
234 => Ord (a, b, c, d, e, f, g, h, i, j, k, l, m)
235 deriving instance (Ord a, Ord b, Ord c, Ord d, Ord e, Ord f, Ord g,
236 Ord h, Ord i, Ord j, Ord k, Ord l, Ord m, Ord n)
237 => Ord (a, b, c, d, e, f, g, h, i, j, k, l, m, n)
238 deriving instance (Ord a, Ord b, Ord c, Ord d, Ord e, Ord f, Ord g,
239 Ord h, Ord i, Ord j, Ord k, Ord l, Ord m, Ord n, Ord o)
240 => Ord (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o)
241
242 instance (Ord a) => Ord [a] where
243 {-# SPECIALISE instance Ord [[Char]] #-}
244 {-# SPECIALISE instance Ord [Char] #-}
245 {-# SPECIALISE instance Ord [Int] #-}
246 compare [] [] = EQ
247 compare [] (_:_) = LT
248 compare (_:_) [] = GT
249 compare (x:xs) (y:ys) = case compare x y of
250 EQ -> compare xs ys
251 other -> other
252
253 deriving instance Ord Bool
254 deriving instance Ord Ordering
255 deriving instance Ord Word
256
257 -- We don't use deriving for Ord Char, because for Ord the derived
258 -- instance defines only compare, which takes two primops. Then
259 -- '>' uses compare, and therefore takes two primops instead of one.
260 instance Ord Char where
261 (C# c1) > (C# c2) = isTrue# (c1 `gtChar#` c2)
262 (C# c1) >= (C# c2) = isTrue# (c1 `geChar#` c2)
263 (C# c1) <= (C# c2) = isTrue# (c1 `leChar#` c2)
264 (C# c1) < (C# c2) = isTrue# (c1 `ltChar#` c2)
265
266 instance Ord Float where
267 (F# x) `compare` (F# y)
268 = if isTrue# (x `ltFloat#` y) then LT
269 else if isTrue# (x `eqFloat#` y) then EQ
270 else GT
271
272 (F# x) < (F# y) = isTrue# (x `ltFloat#` y)
273 (F# x) <= (F# y) = isTrue# (x `leFloat#` y)
274 (F# x) >= (F# y) = isTrue# (x `geFloat#` y)
275 (F# x) > (F# y) = isTrue# (x `gtFloat#` y)
276
277 instance Ord Double where
278 (D# x) `compare` (D# y)
279 = if isTrue# (x <## y) then LT
280 else if isTrue# (x ==## y) then EQ
281 else GT
282
283 (D# x) < (D# y) = isTrue# (x <## y)
284 (D# x) <= (D# y) = isTrue# (x <=## y)
285 (D# x) >= (D# y) = isTrue# (x >=## y)
286 (D# x) > (D# y) = isTrue# (x >## y)
287
288 instance Ord Int where
289 compare = compareInt
290 (<) = ltInt
291 (<=) = leInt
292 (>=) = geInt
293 (>) = gtInt
294
295 {-# INLINE gtInt #-}
296 {-# INLINE geInt #-}
297 {-# INLINE ltInt #-}
298 {-# INLINE leInt #-}
299 gtInt, geInt, ltInt, leInt :: Int -> Int -> Bool
300 (I# x) `gtInt` (I# y) = isTrue# (x ># y)
301 (I# x) `geInt` (I# y) = isTrue# (x >=# y)
302 (I# x) `ltInt` (I# y) = isTrue# (x <# y)
303 (I# x) `leInt` (I# y) = isTrue# (x <=# y)
304
305 compareInt :: Int -> Int -> Ordering
306 (I# x#) `compareInt` (I# y#) = compareInt# x# y#
307
308 compareInt# :: Int# -> Int# -> Ordering
309 compareInt# x# y#
310 | isTrue# (x# <# y#) = LT
311 | isTrue# (x# ==# y#) = EQ
312 | True = GT
313
314 -- OK, so they're technically not part of a class...:
315
316 -- Boolean functions
317
318 -- | Boolean \"and\"
319 (&&) :: Bool -> Bool -> Bool
320 True && x = x
321 False && _ = False
322
323 -- | Boolean \"or\"
324 (||) :: Bool -> Bool -> Bool
325 True || _ = True
326 False || x = x
327
328 -- | Boolean \"not\"
329 not :: Bool -> Bool
330 not True = False
331 not False = True
332
333
334 ------------------------------------------------------------------------
335 -- These don't really belong here, but we don't have a better place to
336 -- put them
337
338 divInt# :: Int# -> Int# -> Int#
339 x# `divInt#` y#
340 -- Be careful NOT to overflow if we do any additional arithmetic
341 -- on the arguments... the following previous version of this
342 -- code has problems with overflow:
343 -- | (x# ># 0#) && (y# <# 0#) = ((x# -# y#) -# 1#) `quotInt#` y#
344 -- | (x# <# 0#) && (y# ># 0#) = ((x# -# y#) +# 1#) `quotInt#` y#
345 = if isTrue# (x# ># 0#) && isTrue# (y# <# 0#) then ((x# -# 1#) `quotInt#` y#) -# 1#
346 else if isTrue# (x# <# 0#) && isTrue# (y# ># 0#) then ((x# +# 1#) `quotInt#` y#) -# 1#
347 else x# `quotInt#` y#
348
349 modInt# :: Int# -> Int# -> Int#
350 x# `modInt#` y#
351 = if isTrue# (x# ># 0#) && isTrue# (y# <# 0#) ||
352 isTrue# (x# <# 0#) && isTrue# (y# ># 0#)
353 then if isTrue# (r# /=# 0#) then r# +# y# else 0#
354 else r#
355 where
356 !r# = x# `remInt#` y#
357
358
359 {- *************************************************************
360 * *
361 * Constraint tuples *
362 * *
363 ************************************************************* -}
364
365 class ()
366 class (c1, c2) => (c1, c2)
367 class (c1, c2, c3) => (c1, c2, c3)
368 class (c1, c2, c3, c4) => (c1, c2, c3, c4)
369 class (c1, c2, c3, c4, c5) => (c1, c2, c3, c4, c5)
370 class (c1, c2, c3, c4, c5, c6) => (c1, c2, c3, c4, c5, c6)
371 class (c1, c2, c3, c4, c5, c6, c7) => (c1, c2, c3, c4, c5, c6, c7)
372 class (c1, c2, c3, c4, c5, c6, c7, c8) => (c1, c2, c3, c4, c5, c6, c7, c8)
373 class (c1, c2, c3, c4, c5, c6, c7, c8, c9)
374 => (c1, c2, c3, c4, c5, c6, c7, c8, c9)
375 class (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10)
376 => (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10)
377 class (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11)
378 => (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11)
379 class (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12)
380 => (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12)
381 class (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13)
382 => (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13)
383 class (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14)
384 => (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14)
385 class (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15)
386 => (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15)
387 class (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16)
388 => (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16)
389 class (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
390 c17)
391 => (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
392 c17)
393 class (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
394 c17,c18)
395 => (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
396 c17, c18)
397 class (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
398 c17, c18, c19)
399 => (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
400 c17, c18, c19)
401 class (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
402 c17, c18, c19, c20)
403 => (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
404 c17, c18, c19, c20)
405 class (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
406 c17, c18, c19, c20, c21)
407 => (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
408 c17, c18, c19, c20, c21)
409 class (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
410 c17, c18, c19, c20, c21, c22)
411 => (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
412 c17, c18, c19, c20, c21, c22)
413 class (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
414 c17, c18, c19, c20, c21, c22, c23)
415 => (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
416 c17, c18, c19, c20, c21, c22, c23)
417 class (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
418 c17, c18, c19, c20, c21, c22, c23, c24)
419 => (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
420 c17, c18, c19, c20, c21, c22, c23, c24)
421 class (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
422 c17, c18, c19, c20, c21, c22, c23, c24, c25)
423 => (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
424 c17, c18, c19, c20, c21, c22, c23, c24, c25)
425 class (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
426 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26)
427 => (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
428 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26)
429 class (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
430 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27)
431 => (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
432 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27)
433 class (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
434 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28)
435 => (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
436 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28)
437 class (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
438 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29)
439 => (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
440 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29)
441 class (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
442 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30)
443 => (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
444 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30)
445 class (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
446 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
447 c31)
448 => (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
449 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
450 c31)
451 class (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
452 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
453 c31, c32)
454 => (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
455 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
456 c31, c32)
457 class (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
458 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
459 c31, c32, c33)
460 => (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
461 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
462 c31, c32, c33)
463 class (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
464 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
465 c31, c32, c33, c34)
466 => (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
467 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
468 c31, c32, c33, c34)
469 class (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
470 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
471 c31, c32, c33, c34, c35)
472 => (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
473 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
474 c31, c32, c33, c34, c35)
475 class (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
476 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
477 c31, c32, c33, c34, c35, c36)
478 => (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
479 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
480 c31, c32, c33, c34, c35, c36)
481 class (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
482 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
483 c31, c32, c33, c34, c35, c36, c37)
484 => (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
485 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
486 c31, c32, c33, c34, c35, c36, c37)
487 class (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
488 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
489 c31, c32, c33, c34, c35, c36, c37, c38)
490 => (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
491 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
492 c31, c32, c33, c34, c35, c36, c37, c38)
493 class (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
494 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
495 c31, c32, c33, c34, c35, c36, c37, c38, c39)
496 => (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
497 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
498 c31, c32, c33, c34, c35, c36, c37, c38, c39)
499 class (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
500 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
501 c31, c32, c33, c34, c35, c36, c37, c38, c39, c40)
502 => (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
503 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
504 c31, c32, c33, c34, c35, c36, c37, c38, c39, c40)
505 class (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
506 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
507 c31, c32, c33, c34, c35, c36, c37, c38, c39, c40, c41)
508 => (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
509 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
510 c31, c32, c33, c34, c35, c36, c37, c38, c39, c40, c41)
511 class (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
512 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
513 c31, c32, c33, c34, c35, c36, c37, c38, c39, c40, c41, c42)
514 => (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
515 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
516 c31, c32, c33, c34, c35, c36, c37, c38, c39, c40, c41, c42)
517 class (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
518 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
519 c31, c32, c33, c34, c35, c36, c37, c38, c39, c40, c41, c42, c43)
520 => (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
521 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
522 c31, c32, c33, c34, c35, c36, c37, c38, c39, c40, c41, c42, c43)
523 class (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
524 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
525 c31, c32, c33, c34, c35, c36, c37, c38, c39, c40, c41, c42, c43, c44)
526 => (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
527 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
528 c31, c32, c33, c34, c35, c36, c37, c38, c39, c40, c41, c42, c43, c44)
529 class (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
530 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
531 c31, c32, c33, c34, c35, c36, c37, c38, c39, c40, c41, c42, c43, c44,
532 c45)
533 => (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
534 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
535 c31, c32, c33, c34, c35, c36, c37, c38, c39, c40, c41, c42, c43, c44,
536 c45)
537 class (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
538 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
539 c31, c32, c33, c34, c35, c36, c37, c38, c39, c40, c41, c42, c43, c44,
540 c45, c46)
541 => (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
542 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
543 c31, c32, c33, c34, c35, c36, c37, c38, c39, c40, c41, c42, c43, c44,
544 c45, c46)
545 class (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
546 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
547 c31, c32, c33, c34, c35, c36, c37, c38, c39, c40, c41, c42, c43, c44,
548 c45, c46, c47)
549 => (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
550 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
551 c31, c32, c33, c34, c35, c36, c37, c38, c39, c40, c41, c42, c43, c44,
552 c45, c46, c47)
553 class (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
554 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
555 c31, c32, c33, c34, c35, c36, c37, c38, c39, c40, c41, c42, c43, c44,
556 c45, c46, c47, c48)
557 => (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
558 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
559 c31, c32, c33, c34, c35, c36, c37, c38, c39, c40, c41, c42, c43, c44,
560 c45, c46, c47, c48)
561 class (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
562 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
563 c31, c32, c33, c34, c35, c36, c37, c38, c39, c40, c41, c42, c43, c44,
564 c45, c46, c47, c48, c49)
565 => (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
566 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
567 c31, c32, c33, c34, c35, c36, c37, c38, c39, c40, c41, c42, c43, c44,
568 c45, c46, c47, c48, c49)
569 class (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
570 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
571 c31, c32, c33, c34, c35, c36, c37, c38, c39, c40, c41, c42, c43, c44,
572 c45, c46, c47, c48, c49, c50)
573 => (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
574 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
575 c31, c32, c33, c34, c35, c36, c37, c38, c39, c40, c41, c42, c43, c44,
576 c45, c46, c47, c48, c49, c50)
577 class (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
578 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
579 c31, c32, c33, c34, c35, c36, c37, c38, c39, c40, c41, c42, c43, c44,
580 c45, c46, c47, c48, c49, c50, c51)
581 => (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
582 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
583 c31, c32, c33, c34, c35, c36, c37, c38, c39, c40, c41, c42, c43, c44,
584 c45, c46, c47, c48, c49, c50, c51)
585 class (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
586 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
587 c31, c32, c33, c34, c35, c36, c37, c38, c39, c40, c41, c42, c43, c44,
588 c45, c46, c47, c48, c49, c50, c51, c52)
589 => (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
590 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
591 c31, c32, c33, c34, c35, c36, c37, c38, c39, c40, c41, c42, c43, c44,
592 c45, c46, c47, c48, c49, c50, c51, c52)
593 class (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
594 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
595 c31, c32, c33, c34, c35, c36, c37, c38, c39, c40, c41, c42, c43, c44,
596 c45, c46, c47, c48, c49, c50, c51, c52, c53)
597 => (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
598 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
599 c31, c32, c33, c34, c35, c36, c37, c38, c39, c40, c41, c42, c43, c44,
600 c45, c46, c47, c48, c49, c50, c51, c52, c53)
601 class (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
602 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
603 c31, c32, c33, c34, c35, c36, c37, c38, c39, c40, c41, c42, c43, c44,
604 c45, c46, c47, c48, c49, c50, c51, c52, c53, c54)
605 => (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
606 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
607 c31, c32, c33, c34, c35, c36, c37, c38, c39, c40, c41, c42, c43, c44,
608 c45, c46, c47, c48, c49, c50, c51, c52, c53, c54)
609 class (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
610 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
611 c31, c32, c33, c34, c35, c36, c37, c38, c39, c40, c41, c42, c43, c44,
612 c45, c46, c47, c48, c49, c50, c51, c52, c53, c54, c55)
613 => (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
614 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
615 c31, c32, c33, c34, c35, c36, c37, c38, c39, c40, c41, c42, c43, c44,
616 c45, c46, c47, c48, c49, c50, c51, c52, c53, c54, c55)
617 class (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
618 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
619 c31, c32, c33, c34, c35, c36, c37, c38, c39, c40, c41, c42, c43, c44,
620 c45, c46, c47, c48, c49, c50, c51, c52, c53, c54, c55, c56)
621 => (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
622 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
623 c31, c32, c33, c34, c35, c36, c37, c38, c39, c40, c41, c42, c43, c44,
624 c45, c46, c47, c48, c49, c50, c51, c52, c53, c54, c55, c56)
625 class (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
626 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
627 c31, c32, c33, c34, c35, c36, c37, c38, c39, c40, c41, c42, c43, c44,
628 c45, c46, c47, c48, c49, c50, c51, c52, c53, c54, c55, c56, c57)
629 => (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
630 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
631 c31, c32, c33, c34, c35, c36, c37, c38, c39, c40, c41, c42, c43, c44,
632 c45, c46, c47, c48, c49, c50, c51, c52, c53, c54, c55, c56, c57)
633 class (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
634 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
635 c31, c32, c33, c34, c35, c36, c37, c38, c39, c40, c41, c42, c43, c44,
636 c45, c46, c47, c48, c49, c50, c51, c52, c53, c54, c55, c56, c57, c58)
637 => (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
638 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
639 c31, c32, c33, c34, c35, c36, c37, c38, c39, c40, c41, c42, c43, c44,
640 c45, c46, c47, c48, c49, c50, c51, c52, c53, c54, c55, c56, c57, c58)
641 class (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
642 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
643 c31, c32, c33, c34, c35, c36, c37, c38, c39, c40, c41, c42, c43, c44,
644 c45, c46, c47, c48, c49, c50, c51, c52, c53, c54, c55, c56, c57, c58,
645 c59)
646 => (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
647 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
648 c31, c32, c33, c34, c35, c36, c37, c38, c39, c40, c41, c42, c43, c44,
649 c45, c46, c47, c48, c49, c50, c51, c52, c53, c54, c55, c56, c57, c58,
650 c59)
651 class (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
652 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
653 c31, c32, c33, c34, c35, c36, c37, c38, c39, c40, c41, c42, c43, c44,
654 c45, c46, c47, c48, c49, c50, c51, c52, c53, c54, c55, c56, c57, c58,
655 c59, c60)
656 => (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
657 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
658 c31, c32, c33, c34, c35, c36, c37, c38, c39, c40, c41, c42, c43, c44,
659 c45, c46, c47, c48, c49, c50, c51, c52, c53, c54, c55, c56, c57, c58,
660 c59, c60)
661 class (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
662 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
663 c31, c32, c33, c34, c35, c36, c37, c38, c39, c40, c41, c42, c43, c44,
664 c45, c46, c47, c48, c49, c50, c51, c52, c53, c54, c55, c56, c57, c58,
665 c59, c60, c61)
666 => (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
667 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
668 c31, c32, c33, c34, c35, c36, c37, c38, c39, c40, c41, c42, c43, c44,
669 c45, c46, c47, c48, c49, c50, c51, c52, c53, c54, c55, c56, c57, c58,
670 c59, c60, c61)
671 class (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
672 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
673 c31, c32, c33, c34, c35, c36, c37, c38, c39, c40, c41, c42, c43, c44,
674 c45, c46, c47, c48, c49, c50, c51, c52, c53, c54, c55, c56, c57, c58,
675 c59, c60, c61, c62)
676 => (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16,
677 c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30,
678 c31, c32, c33, c34, c35, c36, c37, c38, c39, c40, c41, c42, c43, c44,
679 c45, c46, c47, c48, c49, c50, c51, c52, c53, c54, c55, c56, c57, c58,
680 c59, c60, c61, c62)
681