@@ -0,0 +1,343 @@
1+{-# LANGUAGE AllowAmbiguousTypes #-}
2+{-# LANGUAGE CPP #-}
3+{-# LANGUAGE ConstraintKinds #-}
4+{-# LANGUAGE FlexibleInstances #-}
5+{-# LANGUAGE FunctionalDependencies #-}
6+{-# LANGUAGE GADTs #-}
7+{-# LANGUAGE ScopedTypeVariables #-}
8+{-# LANGUAGE TupleSections #-}
9+{-# LANGUAGE TypeApplications #-}
10+{-# LANGUAGE TypeFamilies #-}
11+{-# LANGUAGE TypeInType #-}
12+{-# LANGUAGE TypeOperators #-}
13+{-# LANGUAGE UndecidableInstances #-}
14+
15+#if __GLASGOW_HASKELL__ == 802
16+{-# OPTIONS_GHC -fno-solve-constant-dicts #-}
17+#endif
18+
19+
20+-----------------------------------------------------------------------------
21+-- |
22+-- Module : Data.Generics.Product.Internal.List
23+-- Copyright : (C) 2017 Csongor Kiss
24+-- License : BSD3
25+-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
26+-- Stability : experimental
27+-- Portability : non-portable
28+--
29+-- Derive an isomorphism between a product type and a flat HList.
30+--
31+-----------------------------------------------------------------------------
32+
33+module Data.Generics.Product.Internal.List
34+ ( GIsList (..)
35+ , IndexList (..)
36+ , List (..)
37+ , type (++)
38+ , Elem
39+ , ListTuple (..)
40+ , TupleToList
41+ , Permuting (..)
42+ , Appending (..)
43+ ) where
44+
45+import GHC.TypeLits
46+import Data.Generics.Internal.Lens
47+
48+import Data.Kind (Type)
49+import GHC.Generics
50+
51+data List (as :: [(m, Type)]) where
52+ Nil :: List '[]
53+ (:>) :: a -> List as -> List ('(s, a) ': as)
54+
55+infixr 5 :>
56+
57+type family ((as :: [k]) ++ (bs :: [k])) :: [k] where
58+ '[] ++ bs = bs
59+ (a ': as) ++ bs = a ': as ++ bs
60+
61+instance Monoid (List '[]) where
62+ mempty = Nil
63+ mappend _ _ = Nil
64+
65+instance (Monoid a, Monoid (List as)) => Monoid (List ('(k, a) ': as)) where
66+ mempty = mempty :> mempty
67+ mappend (x :> xs) (y :> ys) = mappend x y :> mappend xs ys
68+
69+class Elem (as :: [(k, Type)]) (key :: k) (i :: Nat) a | as key -> i a
70+instance {-# OVERLAPPING #-} pos ~ 0 => Elem ('(key, a) ': xs) key pos a
71+instance (Elem xs key i a, pos ~ (i + 1)) => Elem (x ': xs) key pos a
72+
73+class GIsList
74+ (m :: Type)
75+ (f :: Type -> Type)
76+ (g :: Type -> Type)
77+ (as :: [(m, Type)])
78+ (bs :: [(m, Type)]) | m f -> as, m g -> bs, bs f -> g, as g -> f where
79+
80+ glist :: Iso (f x) (g x) (List as) (List bs)
81+
82+ glistL :: Lens (f x) (g x) (List as) (List bs)
83+ glistL f s = glist @m f s
84+
85+ glistR :: Lens (List bs) (List as) (g x) (f x)
86+ glistR f s = fromIso (glist @m) f s
87+
88+instance
89+ ( GIsList m l l' as as'
90+ , GIsList m r r' bs bs'
91+ , Appending List as bs cs as' bs' cs'
92+ , cs ~ (as ++ bs)
93+ , cs' ~ (as' ++ bs')
94+ ) => GIsList m (l :*: r) (l' :*: r') cs cs' where
95+
96+ glist = prodIso . pairing (glist @m) (glist @m) . appending
97+
98+instance GIsList m f g as bs => GIsList m (M1 t meta f) (M1 t meta g) as bs where
99+ glist = mIso . glist @m
100+
101+instance {-# OVERLAPS #-}
102+ GIsList Symbol
103+ (S1 ('MetaSel ('Just field) u s i) (Rec0 a))
104+ (S1 ('MetaSel ('Just field) u s i) (Rec0 b))
105+ '[ '(field, a)] '[ '(field, b)] where
106+ glist = mIso . kIso . singleton
107+
108+instance GIsList Type (Rec0 a) (Rec0 a) '[ '(a, a)] '[ '(a, a)] where
109+ glist = kIso . singleton
110+
111+instance GIsList () (Rec0 a) (Rec0 b) '[ '( '(), a)] '[ '( '(), b)] where
112+ glist = kIso . singleton
113+
114+instance GIsList m U1 U1 '[] '[] where
115+ glist = iso (const Nil) (const U1)
116+
117+--------------------------------------------------------------------------------
118+-- as ++ bs == cs
119+-- as' + == cs'
120+class Appending f (as :: [k]) bs cs (as' :: [k]) bs' cs' | as bs cs cs' -> as' bs', as' bs' cs cs' -> as bs, as bs -> cs, as' bs' -> cs' where
121+ appending :: Iso (f as, f bs) (f as', f bs') (f cs) (f cs')
122+
123+instance Appending List '[] bs bs '[] bs' bs' where
124+ appending = iso snd (Nil,)
125+
126+instance Appending List as bs cs as' bs' cs'
127+ => Appending List ('(f, a) ': as) bs ('(f, a) ': cs) ('(f, a') ': as') bs' ('(f, a') ': cs') where
128+ appending = pairing (fromIso consing) id . assoc3 . pairing id appending . consing
129+
130+singleton :: Iso a b (List '[ '(field, a)]) (List '[ '(field, b)])
131+singleton = iso (:> Nil) (\(x :> _) -> x)
132+
133+consing :: Iso (a, List as) (b, List bs) (List ('(f, a) ': as)) (List ('(f, b) ': bs))
134+consing = iso (\(x, xs) -> x :> xs) (\(x :> xs) -> (x, xs))
135+
136+--------------------------------------------------------------------------------
137+
138+-- This ended up not being used now... still cool to have
139+flipping :: Iso' (List (a1 ': a2 ': as)) (List (a2 ': a1 ': as))
140+flipping = iso
141+ (\(a1 :> a2 :> as) -> a2 :> a1 :> as)
142+ (\(a2 :> a1 :> as) -> a1 :> a2 :> as)
143+
144+class Inserting f a as bs | bs a -> as where
145+ inserting :: Iso' (f (a ': as)) (f bs)
146+
147+instance Inserting f a as (a ': as) where
148+ inserting = id
149+
150+instance Inserting List a as bs => Inserting List a ('(fb, b) ': as) ('(fb, b) ': bs) where
151+ inserting = flipping . fromIso consing . pairing id (inserting @_ @a) . consing
152+
153+class Permuting f as bs where
154+ permuting :: Iso' (f as) (f bs)
155+
156+instance Permuting List '[] '[] where
157+ permuting = id
158+
159+instance (Permuting List as as', Inserting List '(fa, a) as' bs')
160+ => Permuting List ('(fa, a) ': as) bs' where
161+ permuting = fromIso consing . pairing id permuting . consing . (inserting @_ @'(fa, _))
162+
163+--------------------------------------------------------------------------------
164+class IndexList (i :: Nat) as bs a b | i as -> a, i bs -> b, i as b -> bs, i bs a -> as where
165+ point :: Lens (List as) (List bs) a b
166+
167+instance {-# OVERLAPPING #-}
168+ ( as ~ ('(f, a) ': as')
169+ , bs ~ ('(f, b) ': as')
170+ ) => IndexList 0 as bs a b where
171+ point f (x :> xs) = (:> xs) <$> f x
172+ {-# INLINE point #-}
173+
174+instance
175+ ( IndexList (n - 1) as' bs' a b
176+ , as ~ (x ': as')
177+ , bs ~ (x ': bs')
178+ ) => IndexList n as bs a b where
179+ point f (x :> xs) = (x :>) <$> point @(n - 1) f xs
180+ {-# INLINE point #-}
181+
182+--------------------------------------------------------------------------------
183+-- * Convert tuples to/from HLists
184+
185+class ListTuple (tuple :: Type) (as :: [(k, Type)]) | as -> tuple where
186+ type ListToTuple as :: Type
187+ tupled :: Iso' (List as) tuple
188+ tupled = iso listToTuple tupleToList
189+
190+ tupleToList :: tuple -> List as
191+ listToTuple :: List as -> tuple
192+
193+instance ListTuple () '[] where
194+ type ListToTuple '[] = ()
195+ tupleToList _ = Nil
196+ listToTuple _ = ()
197+
198+instance ListTuple a '[ '(fa, a)] where
199+ type ListToTuple '[ '(fa, a)] = a
200+ tupleToList a
201+ = a :> Nil
202+ listToTuple (a :> Nil)
203+ = a
204+
205+instance ListTuple (a, b) '[ '(fa, a), '(fb, b)] where
206+ type ListToTuple '[ '(fa, a), '(fb, b)] = (a, b)
207+ tupleToList (a, b)
208+ = a :> b :> Nil
209+ listToTuple (a :> b :> Nil)
210+ = (a, b)
211+
212+instance ListTuple (a, b, c) '[ '(fa, a), '(fb, b), '(fc, c)] where
213+ type ListToTuple '[ '(fa, a), '(fb, b), '(fc, c)] = (a, b, c)
214+ tupleToList (a, b, c)
215+ = a :> b :> c :> Nil
216+ listToTuple (a :> b :> c :> Nil)
217+ = (a, b, c)
218+
219+instance ListTuple (a, b, c, d) '[ '(fa, a), '(fb, b), '(fc, c), '(fd, d)] where
220+ type ListToTuple '[ '(fa, a), '(fb, b), '(fc, c), '(fd, d)] = (a, b, c, d)
221+ tupleToList (a, b, c, d)
222+ = a :> b :> c :> d:> Nil
223+ listToTuple (a :> b :> c :> d :> Nil)
224+ = (a, b, c, d)
225+
226+instance ListTuple (a, b, c, d, e) '[ '(fa, a), '(fb, b), '(fc, c), '(fd, d), '(fe, e)] where
227+ type ListToTuple '[ '(fa, a), '(fb, b), '(fc, c), '(fd, d), '(fe, e)] = (a, b, c, d, e)
228+ tupleToList (a, b, c, d, e)
229+ = a :> b :> c :> d:> e :> Nil
230+ listToTuple (a :> b :> c :> d :> e :> Nil)
231+ = (a, b, c, d, e)
232+
233+instance ListTuple (a, b, c, d, e, f) '[ '(fa, a), '(fb, b), '(fc, c), '(fd, d), '(fe, e), '(ff, f)] where
234+ type ListToTuple '[ '(fa, a), '(fb, b), '(fc, c), '(fd, d), '(fe, e), '(ff, f)] = (a, b, c, d, e, f)
235+ tupleToList (a, b, c, d, e, f)
236+ = a :> b :> c :> d:> e :> f :> Nil
237+ listToTuple (a :> b :> c :> d :> e :> f :> Nil)
238+ = (a, b, c, d, e, f)
239+
240+instance ListTuple (a, b, c, d, e, f, g) '[ '(fa, a), '(fb, b), '(fc, c), '(fd, d), '(fe, e), '(ff, f), '(fg, g)] where
241+ type ListToTuple '[ '(fa, a), '(fb, b), '(fc, c), '(fd, d), '(fe, e), '(ff, f), '(fg, g)] = (a, b, c, d, e, f, g)
242+ tupleToList (a, b, c, d, e, f, g)
243+ = a :> b :> c :> d:> e :> f :> g :> Nil
244+ listToTuple (a :> b :> c :> d :> e :> f :> g :> Nil)
245+ = (a, b, c, d, e, f, g)
246+
247+instance ListTuple (a, b, c, d, e, f, g, h) '[ '(fa, a), '(fb, b), '(fc, c), '(fd, d), '(fe, e), '(ff, f), '(fg, g), '(fh, h)] where
248+ type ListToTuple '[ '(fa, a), '(fb, b), '(fc, c), '(fd, d), '(fe, e), '(ff, f), '(fg, g), '(fh, h)] = (a, b, c, d, e, f, g, h)
249+ tupleToList (a, b, c, d, e, f, g, h)
250+ = a :> b :> c :> d:> e :> f :> g :> h :> Nil
251+ listToTuple (a :> b :> c :> d :> e :> f :> g :> h :> Nil)
252+ = (a, b, c, d, e, f, g, h)
253+
254+instance ListTuple (a, b, c, d, e, f, g, h, j) '[ '(fa, a), '(fb, b), '(fc, c), '(fd, d), '(fe, e), '(ff, f), '(fg, g), '(fh, h), '(fj, j)] where
255+ type ListToTuple '[ '(fa, a), '(fb, b), '(fc, c), '(fd, d), '(fe, e), '(ff, f), '(fg, g), '(fh, h), '(fj, j)] = (a, b, c, d, e, f, g, h, j)
256+ tupleToList (a, b, c, d, e, f, g, h, j)
257+ = a :> b :> c :> d:> e :> f :> g :> h :> j :> Nil
258+ listToTuple (a :> b :> c :> d :> e :> f :> g :> h :> j :> Nil)
259+ = (a, b, c, d, e, f, g, h, j)
260+
261+instance ListTuple (a, b, c, d, e, f, g, h, j, k) '[ '(fa, a), '(fb, b), '(fc, c), '(fd, d), '(fe, e), '(ff, f), '(fg, g), '(fh, h), '(fj, j), '(fk, k)] where
262+ type ListToTuple '[ '(fa, a), '(fb, b), '(fc, c), '(fd, d), '(fe, e), '(ff, f), '(fg, g), '(fh, h), '(fj, j), '(fk, k)] = (a, b, c, d, e, f, g, h, j, k)
263+ tupleToList (a, b, c, d, e, f, g, h, j, k)
264+ = a :> b :> c :> d:> e :> f :> g :> h :> j :> k :> Nil
265+ listToTuple (a :> b :> c :> d :> e :> f :> g :> h :> j :> k :> Nil)
266+ = (a, b, c, d, e, f, g, h, j, k)
267+
268+instance ListTuple (a, b, c, d, e, f, g, h, j, k, l) '[ '(fa, a), '(fb, b), '(fc, c), '(fd, d), '(fe, e), '(ff, f), '(fg, g), '(fh, h), '(fj, j), '(fk, k), '(fl, l)] where
269+ type ListToTuple '[ '(fa, a), '(fb, b), '(fc, c), '(fd, d), '(fe, e), '(ff, f), '(fg, g), '(fh, h), '(fj, j), '(fk, k), '(fl, l)] = (a, b, c, d, e, f, g, h, j, k, l)
270+ tupleToList (a, b, c, d, e, f, g, h, j, k, l)
271+ = a :> b :> c :> d:> e :> f :> g :> h :> j :> k :> l :> Nil
272+ listToTuple (a :> b :> c :> d :> e :> f :> g :> h :> j :> k :> l :> Nil)
273+ = (a, b, c, d, e, f, g, h, j, k, l)
274+
275+instance ListTuple (a, b, c, d, e, f, g, h, j, k, l, m) '[ '(fa, a), '(fb, b), '(fc, c), '(fd, d), '(fe, e), '(ff, f), '(fg, g), '(fh, h), '(fj, j), '(fk, k), '(fl, l), '(fm, m)] where
276+ type ListToTuple '[ '(fa, a), '(fb, b), '(fc, c), '(fd, d), '(fe, e), '(ff, f), '(fg, g), '(fh, h), '(fj, j), '(fk, k), '(fl, l), '(fm, m)] = (a, b, c, d, e, f, g, h, j, k, l, m)
277+ tupleToList (a, b, c, d, e, f, g, h, j, k, l, m)
278+ = a :> b :> c :> d:> e :> f :> g :> h :> j :> k :> l :> m :> Nil
279+ listToTuple (a :> b :> c :> d :> e :> f :> g :> h :> j :> k :> l :> m :> Nil)
280+ = (a, b, c, d, e, f, g, h, j, k, l, m)
281+
282+instance ListTuple (a, b, c, d, e, f, g, h, j, k, l, m, n) '[ '(fa, a), '(fb, b), '(fc, c), '(fd, d), '(fe, e), '(ff, f), '(fg, g), '(fh, h), '(fj, j), '(fk, k), '(fl, l), '(fm, m), '(fn, n)] where
283+ type ListToTuple '[ '(fa, a), '(fb, b), '(fc, c), '(fd, d), '(fe, e), '(ff, f), '(fg, g), '(fh, h), '(fj, j), '(fk, k), '(fl, l), '(fm, m), '(fn, n)] = (a, b, c, d, e, f, g, h, j, k, l, m, n)
284+ tupleToList (a, b, c, d, e, f, g, h, j, k, l, m, n)
285+ = a :> b :> c :> d:> e :> f :> g :> h :> j :> k :> l :> m :> n :> Nil
286+ listToTuple (a :> b :> c :> d :> e :> f :> g :> h :> j :> k :> l :> m :> n :> Nil)
287+ = (a, b, c, d, e, f, g, h, j, k, l, m, n)
288+
289+instance ListTuple (a, b, c, d, e, f, g, h, j, k, l, m, n, o) '[ '(fa, a), '(fb, b), '(fc, c), '(fd, d), '(fe, e), '(ff, f), '(fg, g), '(fh, h), '(fj, j), '(fk, k), '(fl, l), '(fm, m), '(fn, n), '(fo, o)] where
290+ type ListToTuple '[ '(fa, a), '(fb, b), '(fc, c), '(fd, d), '(fe, e), '(ff, f), '(fg, g), '(fh, h), '(fj, j), '(fk, k), '(fl, l), '(fm, m), '(fn, n), '(fo, o)] = (a, b, c, d, e, f, g, h, j, k, l, m, n, o)
291+ tupleToList (a, b, c, d, e, f, g, h, j, k, l, m, n, o)
292+ = a :> b :> c :> d:> e :> f :> g :> h :> j :> k :> l :> m :> n :> o :> Nil
293+ listToTuple (a :> b :> c :> d :> e :> f :> g :> h :> j :> k :> l :> m :> n :> o :> Nil)
294+ = (a, b, c, d, e, f, g, h, j, k, l, m, n, o)
295+
296+instance ListTuple (a, b, c, d, e, f, g, h, j, k, l, m, n, o, p) '[ '(fa, a), '(fb, b), '(fc, c), '(fd, d), '(fe, e), '(ff, f), '(fg, g), '(fh, h), '(fj, j), '(fk, k), '(fl, l), '(fm, m), '(fn, n), '(fo, o), '(fp, p)] where
297+ type ListToTuple '[ '(fa, a), '(fb, b), '(fc, c), '(fd, d), '(fe, e), '(ff, f), '(fg, g), '(fh, h), '(fj, j), '(fk, k), '(fl, l), '(fm, m), '(fn, n), '(fo, o), '(fp, p)] = (a, b, c, d, e, f, g, h, j, k, l, m, n, o, p)
298+ tupleToList (a, b, c, d, e, f, g, h, j, k, l, m, n, o, p)
299+ = a :> b :> c :> d:> e :> f :> g :> h :> j :> k :> l :> m :> n :> o :> p :> Nil
300+ listToTuple (a :> b :> c :> d :> e :> f :> g :> h :> j :> k :> l :> m :> n :> o :> p :> Nil)
301+ = (a, b, c, d, e, f, g, h, j, k, l, m, n, o, p)
302+
303+instance ListTuple (a, b, c, d, e, f, g, h, j, k, l, m, n, o, p, q) '[ '(fa, a), '(fb, b), '(fc, c), '(fd, d), '(fe, e), '(ff, f), '(fg, g), '(fh, h), '(fj, j), '(fk, k), '(fl, l), '(fm, m), '(fn, n), '(fo, o), '(fp, p), '(fq, q)] where
304+ type ListToTuple '[ '(fa, a), '(fb, b), '(fc, c), '(fd, d), '(fe, e), '(ff, f), '(fg, g), '(fh, h), '(fj, j), '(fk, k), '(fl, l), '(fm, m), '(fn, n), '(fo, o), '(fp, p), '(fq, q)] = (a, b, c, d, e, f, g, h, j, k, l, m, n, o, p, q)
305+ tupleToList (a, b, c, d, e, f, g, h, j, k, l, m, n, o, p, q)
306+ = a :> b :> c :> d:> e :> f :> g :> h :> j :> k :> l :> m :> n :> o :> p :> q :> Nil
307+ listToTuple (a :> b :> c :> d :> e :> f :> g :> h :> j :> k :> l :> m :> n :> o :> p :> q :> Nil)
308+ = (a, b, c, d, e, f, g, h, j, k, l, m, n, o, p, q)
309+
310+instance ListTuple (a, b, c, d, e, f, g, h, j, k, l, m, n, o, p, q, r) '[ '(fa, a), '(fb, b), '(fc, c), '(fd, d), '(fe, e), '(ff, f), '(fg, g), '(fh, h), '(fj, j), '(fk, k), '(fl, l), '(fm, m), '(fn, n), '(fo, o), '(fp, p), '(fq, q), '(fr, r)] where
311+ type ListToTuple '[ '(fa, a), '(fb, b), '(fc, c), '(fd, d), '(fe, e), '(ff, f), '(fg, g), '(fh, h), '(fj, j), '(fk, k), '(fl, l), '(fm, m), '(fn, n), '(fo, o), '(fp, p), '(fq, q), '(fr, r)] = (a, b, c, d, e, f, g, h, j, k, l, m, n, o, p, q, r)
312+ tupleToList (a, b, c, d, e, f, g, h, j, k, l, m, n, o, p, q, r)
313+ = a :> b :> c :> d:> e :> f :> g :> h :> j :> k :> l :> m :> n :> o :> p :> q :> r :> Nil
314+ listToTuple (a :> b :> c :> d :> e :> f :> g :> h :> j :> k :> l :> m :> n :> o :> p :> q :> r :> Nil)
315+ = (a, b, c, d, e, f, g, h, j, k, l, m, n, o, p, q, r)
316+
317+instance ListTuple (a, b, c, d, e, f, g, h, j, k, l, m, n, o, p, q, r, s) '[ '(fa, a), '(fb, b), '(fc, c), '(fd, d), '(fe, e), '(ff, f), '(fg, g), '(fh, h), '(fj, j), '(fk, k), '(fl, l), '(fm, m), '(fn, n), '(fo, o), '(fp, p), '(fq, q), '(fr, r), '(fs, s)] where
318+ type ListToTuple '[ '(fa, a), '(fb, b), '(fc, c), '(fd, d), '(fe, e), '(ff, f), '(fg, g), '(fh, h), '(fj, j), '(fk, k), '(fl, l), '(fm, m), '(fn, n), '(fo, o), '(fp, p), '(fq, q), '(fr, r), '(fs, s)] = (a, b, c, d, e, f, g, h, j, k, l, m, n, o, p, q, r, s)
319+ tupleToList (a, b, c, d, e, f, g, h, j, k, l, m, n, o, p, q, r, s)
320+ = a :> b :> c :> d:> e :> f :> g :> h :> j :> k :> l :> m :> n :> o :> p :> q :> r :> s :> Nil
321+ listToTuple (a :> b :> c :> d :> e :> f :> g :> h :> j :> k :> l :> m :> n :> o :> p :> q :> r :> s :> Nil)
322+ = (a, b, c, d, e, f, g, h, j, k, l, m, n, o, p, q, r, s)
323+
324+type family TupleToList a where
325+ TupleToList () = '[]
326+ TupleToList (a, b) = '[ '( '(), a), '( '(), b)]
327+ TupleToList (a, b, c) = '[ '( '(), a), '( '(), b), '( '(), c)]
328+ TupleToList (a, b, c, d) = '[ '( '(), a), '( '(), b), '( '(), c), '( '(), d)]
329+ TupleToList (a, b, c, d, e) = '[ '( '(), a), '( '(), b), '( '(), c), '( '(), d), '( '(), e)]
330+ TupleToList (a, b, c, d, e, f) = '[ '( '(), a), '( '(), b), '( '(), c), '( '(), d), '( '(), e), '( '(), f)]
331+ TupleToList (a, b, c, d, e, f, g) = '[ '( '(), a), '( '(), b), '( '(), c), '( '(), d), '( '(), e), '( '(), f), '( '(), g)]
332+ TupleToList (a, b, c, d, e, f, g, h) = '[ '( '(), a), '( '(), b), '( '(), c), '( '(), d), '( '(), e), '( '(), f), '( '(), g), '( '(), h)]
333+ TupleToList (a, b, c, d, e, f, g, h, j) = '[ '( '(), a), '( '(), b), '( '(), c), '( '(), d), '( '(), e), '( '(), f), '( '(), g), '( '(), h), '( '(), j)]
334+ TupleToList (a, b, c, d, e, f, g, h, j, k) = '[ '( '(), a), '( '(), b), '( '(), c), '( '(), d), '( '(), e), '( '(), f), '( '(), g), '( '(), h), '( '(), j), '( '(), k)]
335+ TupleToList (a, b, c, d, e, f, g, h, j, k, l) = '[ '( '(), a), '( '(), b), '( '(), c), '( '(), d), '( '(), e), '( '(), f), '( '(), g), '( '(), h), '( '(), j), '( '(), k), '( '(), l)]
336+ TupleToList (a, b, c, d, e, f, g, h, j, k, l, m) = '[ '( '(), a), '( '(), b), '( '(), c), '( '(), d), '( '(), e), '( '(), f), '( '(), g), '( '(), h), '( '(), j), '( '(), k), '( '(), l), '( '(), m)]
337+ TupleToList (a, b, c, d, e, f, g, h, j, k, l, m, n) = '[ '( '(), a), '( '(), b), '( '(), c), '( '(), d), '( '(), e), '( '(), f), '( '(), g), '( '(), h), '( '(), j), '( '(), k), '( '(), l), '( '(), m), '( '(), n)]
338+ TupleToList (a, b, c, d, e, f, g, h, j, k, l, m, n, o) = '[ '( '(), a), '( '(), b), '( '(), c), '( '(), d), '( '(), e), '( '(), f), '( '(), g), '( '(), h), '( '(), j), '( '(), k), '( '(), l), '( '(), m), '( '(), n), '( '(), o)]
339+ TupleToList (a, b, c, d, e, f, g, h, j, k, l, m, n, o, p) = '[ '( '(), a), '( '(), b), '( '(), c), '( '(), d), '( '(), e), '( '(), f), '( '(), g), '( '(), h), '( '(), j), '( '(), k), '( '(), l), '( '(), m), '( '(), n), '( '(), o), '( '(), p)]
340+ TupleToList (a, b, c, d, e, f, g, h, j, k, l, m, n, o, p, q) = '[ '( '(), a), '( '(), b), '( '(), c), '( '(), d), '( '(), e), '( '(), f), '( '(), g), '( '(), h), '( '(), j), '( '(), k), '( '(), l), '( '(), m), '( '(), n), '( '(), o), '( '(), p), '( '(), q)]
341+ TupleToList (a, b, c, d, e, f, g, h, j, k, l, m, n, o, p, q, r) = '[ '( '(), a), '( '(), b), '( '(), c), '( '(), d), '( '(), e), '( '(), f), '( '(), g), '( '(), h), '( '(), j), '( '(), k), '( '(), l), '( '(), m), '( '(), n), '( '(), o), '( '(), p), '( '(), q), '( '(), r)]
342+ TupleToList (a, b, c, d, e, f, g, h, j, k, l, m, n, o, p, q, r, s) = '[ '( '(), a), '( '(), b), '( '(), c), '( '(), d), '( '(), e), '( '(), f), '( '(), g), '( '(), h), '( '(), j), '( '(), k), '( '(), l), '( '(), m), '( '(), n), '( '(), o), '( '(), p), '( '(), q), '( '(), r), '( '(), s)]
343+ TupleToList a = '[ '( '(), a)]