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