@@ -0,0 +1,337 @@
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+ ) where
42+
43+#if __GLASGOW_HASKELL__ < 804
44+import Data.Semigroup
45+#endif
46+import GHC.TypeLits
47+
48+import Data.Kind (Type)
49+import GHC.Generics
50+import Data.Profunctor
51+import Data.Generics.Internal.Profunctor.Lens
52+import Data.Generics.Internal.Profunctor.Iso
53+
54+data List (as :: [(m, Type)]) where
55+ Nil :: List '[]
56+ (:>) :: a -> List as -> List ('(s, a) ': as)
57+
58+infixr 5 :>
59+
60+type family ((as :: [k]) ++ (bs :: [k])) :: [k] where
61+ '[] ++ bs = bs
62+ (a ': as) ++ bs = a ': as ++ bs
63+
64+instance Semigroup (List '[]) where
65+ _ <> _ = Nil
66+
67+instance Monoid (List '[]) where
68+ mempty = Nil
69+ mappend _ _ = Nil
70+
71+instance (Semigroup a, Semigroup (List as)) => Semigroup (List ('(k, a) ': as)) where
72+ (x :> xs) <> (y :> ys) = (x <> y) :> (xs <> ys)
73+
74+instance (Monoid a, Monoid (List as)) => Monoid (List ('(k, a) ': as)) where
75+ mempty = mempty :> mempty
76+ mappend (x :> xs) (y :> ys) = mappend x y :> mappend xs ys
77+
78+class Elem (as :: [(k, Type)]) (key :: k) (i :: Nat) a | as key -> i a
79+instance {-# OVERLAPPING #-} pos ~ 0 => Elem ('(key, a) ': xs) key pos a
80+instance (Elem xs key i a, pos ~ (i + 1)) => Elem (x ': xs) key pos a
81+
82+class GIsList
83+ (m :: Type)
84+ (f :: Type -> Type)
85+ (g :: Type -> Type)
86+ (as :: [(m, Type)])
87+ (bs :: [(m, Type)]) | m f -> as, m g -> bs, bs f -> g, as g -> f where
88+
89+ glist :: Iso (f x) (g x) (List as) (List bs)
90+
91+ -- We define this reversed version, otherwise uses of `fromIso glist` are not
92+ -- properly inlined by GHC 8.0.2.
93+ -- This is not actually used.
94+ glistR :: Iso (List bs) (List as) (g x) (f x)
95+ glistR = fromIso (glist @m)
96+
97+instance
98+ ( GIsList m l l' as as'
99+ , GIsList m r r' bs bs'
100+ , Appending List as bs cs as' bs' cs'
101+ , cs ~ (as ++ bs)
102+ , cs' ~ (as' ++ bs')
103+ ) => GIsList m (l :*: r) (l' :*: r') cs cs' where
104+
105+ glist = prodIso . pairing (glist @m) (glist @m) . appending
106+ {-# INLINE glist #-}
107+
108+instance GIsList m f g as bs => GIsList m (M1 t meta f) (M1 t meta g) as bs where
109+ glist = mIso . glist @m
110+ {-# INLINE glist #-}
111+
112+instance {-# OVERLAPS #-}
113+ GIsList Symbol
114+ (S1 ('MetaSel ('Just field) u s i) (Rec0 a))
115+ (S1 ('MetaSel ('Just field) u s i) (Rec0 b))
116+ '[ '(field, a)] '[ '(field, b)] where
117+ glist = mIso . kIso . singleton
118+ {-# INLINE glist #-}
119+
120+instance GIsList Type (Rec0 a) (Rec0 a) '[ '(a, a)] '[ '(a, a)] where
121+ glist = kIso . singleton
122+ {-# INLINE glist #-}
123+
124+instance GIsList () (Rec0 a) (Rec0 b) '[ '( '(), a)] '[ '( '(), b)] where
125+ glist = kIso . singleton
126+ {-# INLINE glist #-}
127+
128+instance GIsList m U1 U1 '[] '[] where
129+ glist = iso (const Nil) (const U1)
130+ {-# INLINE glist #-}
131+
132+--------------------------------------------------------------------------------
133+-- | as ++ bs === cs
134+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
135+ appending :: Iso (f as, f bs) (f as', f bs') (f cs) (f cs')
136+
137+-- | [] ++ bs === bs
138+instance Appending List '[] bs bs '[] bs' bs' where
139+ appending = iso (\(_, b) -> b) (Nil,)
140+
141+-- | (a : as) ++ bs === (a : cs)
142+instance
143+ Appending List as bs cs as' bs' cs' -- as ++ bs == cs
144+ => Appending List ('(f, a) ': as) bs ('(f, a) ': cs) ('(f, a') ': as') bs' ('(f, a') ': cs') where
145+ appending
146+ = pairing (fromIso consing) id -- ((a, as), bs)
147+ . assoc3 -- (a, (as, bs))
148+ . pairing id appending -- (a, cs)
149+ . consing -- (a : cs)
150+
151+singleton :: Iso a b (List '[ '(field, a)]) (List '[ '(field, b)])
152+singleton = iso (:> Nil) (\(x :> _) -> x)
153+
154+consing :: Iso (a, List as) (b, List bs) (List ('(f, a) ': as)) (List ('(f, b) ': bs))
155+consing = iso (\(x, xs) -> x :> xs) (\(x :> xs) -> (x, xs))
156+
157+--------------------------------------------------------------------------------
158+class IndexList (i :: Nat) as bs a b | i as -> a, i bs -> b, i as b -> bs, i bs a -> as where
159+ point :: Lens (List as) (List bs) a b
160+
161+instance {-# OVERLAPPING #-}
162+ ( as ~ ('(f, a) ': as')
163+ , bs ~ ('(f, b) ': as')
164+ ) => IndexList 0 as bs a b where
165+ point = lens (\(x :> xs) -> (xs, x)) (\(xs, x') -> x' :> xs)
166+ {-# INLINE point #-}
167+
168+instance
169+ ( IndexList (n - 1) as' bs' a b
170+ , as ~ ('(f, x) ': as')
171+ , bs ~ ('(f, x) ': bs')
172+ ) => IndexList n as bs a b where
173+ point = fromIso consing . alongside id (point @(n-1)) . second'
174+ {-# INLINE point #-}
175+
176+--------------------------------------------------------------------------------
177+-- * Convert tuples to/from HLists
178+
179+class ListTuple (tuple :: Type) (as :: [(k, Type)]) | as -> tuple where
180+ type ListToTuple as :: Type
181+ tupled :: Iso' (List as) tuple
182+ tupled = iso listToTuple tupleToList
183+
184+ tupleToList :: tuple -> List as
185+ listToTuple :: List as -> tuple
186+
187+instance ListTuple () '[] where
188+ type ListToTuple '[] = ()
189+ tupleToList _ = Nil
190+ listToTuple _ = ()
191+
192+instance ListTuple a '[ '(fa, a)] where
193+ type ListToTuple '[ '(fa, a)] = a
194+ tupleToList a
195+ = a :> Nil
196+ listToTuple (a :> Nil)
197+ = a
198+
199+instance ListTuple (a, b) '[ '(fa, a), '(fb, b)] where
200+ type ListToTuple '[ '(fa, a), '(fb, b)] = (a, b)
201+ tupleToList (a, b)
202+ = a :> b :> Nil
203+ listToTuple (a :> b :> Nil)
204+ = (a, b)
205+
206+instance ListTuple (a, b, c) '[ '(fa, a), '(fb, b), '(fc, c)] where
207+ type ListToTuple '[ '(fa, a), '(fb, b), '(fc, c)] = (a, b, c)
208+ tupleToList (a, b, c)
209+ = a :> b :> c :> Nil
210+ listToTuple (a :> b :> c :> Nil)
211+ = (a, b, c)
212+
213+instance ListTuple (a, b, c, d) '[ '(fa, a), '(fb, b), '(fc, c), '(fd, d)] where
214+ type ListToTuple '[ '(fa, a), '(fb, b), '(fc, c), '(fd, d)] = (a, b, c, d)
215+ tupleToList (a, b, c, d)
216+ = a :> b :> c :> d:> Nil
217+ listToTuple (a :> b :> c :> d :> Nil)
218+ = (a, b, c, d)
219+
220+instance ListTuple (a, b, c, d, e) '[ '(fa, a), '(fb, b), '(fc, c), '(fd, d), '(fe, e)] where
221+ type ListToTuple '[ '(fa, a), '(fb, b), '(fc, c), '(fd, d), '(fe, e)] = (a, b, c, d, e)
222+ tupleToList (a, b, c, d, e)
223+ = a :> b :> c :> d:> e :> Nil
224+ listToTuple (a :> b :> c :> d :> e :> Nil)
225+ = (a, b, c, d, e)
226+
227+instance ListTuple (a, b, c, d, e, f) '[ '(fa, a), '(fb, b), '(fc, c), '(fd, d), '(fe, e), '(ff, f)] where
228+ type ListToTuple '[ '(fa, a), '(fb, b), '(fc, c), '(fd, d), '(fe, e), '(ff, f)] = (a, b, c, d, e, f)
229+ tupleToList (a, b, c, d, e, f)
230+ = a :> b :> c :> d:> e :> f :> Nil
231+ listToTuple (a :> b :> c :> d :> e :> f :> Nil)
232+ = (a, b, c, d, e, f)
233+
234+instance ListTuple (a, b, c, d, e, f, g) '[ '(fa, a), '(fb, b), '(fc, c), '(fd, d), '(fe, e), '(ff, f), '(fg, g)] where
235+ type ListToTuple '[ '(fa, a), '(fb, b), '(fc, c), '(fd, d), '(fe, e), '(ff, f), '(fg, g)] = (a, b, c, d, e, f, g)
236+ tupleToList (a, b, c, d, e, f, g)
237+ = a :> b :> c :> d:> e :> f :> g :> Nil
238+ listToTuple (a :> b :> c :> d :> e :> f :> g :> Nil)
239+ = (a, b, c, d, e, f, g)
240+
241+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
242+ 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)
243+ tupleToList (a, b, c, d, e, f, g, h)
244+ = a :> b :> c :> d:> e :> f :> g :> h :> Nil
245+ listToTuple (a :> b :> c :> d :> e :> f :> g :> h :> Nil)
246+ = (a, b, c, d, e, f, g, h)
247+
248+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
249+ 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)
250+ tupleToList (a, b, c, d, e, f, g, h, j)
251+ = a :> b :> c :> d:> e :> f :> g :> h :> j :> Nil
252+ listToTuple (a :> b :> c :> d :> e :> f :> g :> h :> j :> Nil)
253+ = (a, b, c, d, e, f, g, h, j)
254+
255+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
256+ 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)
257+ tupleToList (a, b, c, d, e, f, g, h, j, k)
258+ = a :> b :> c :> d:> e :> f :> g :> h :> j :> k :> Nil
259+ listToTuple (a :> b :> c :> d :> e :> f :> g :> h :> j :> k :> Nil)
260+ = (a, b, c, d, e, f, g, h, j, k)
261+
262+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
263+ 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)
264+ tupleToList (a, b, c, d, e, f, g, h, j, k, l)
265+ = a :> b :> c :> d:> e :> f :> g :> h :> j :> k :> l :> Nil
266+ listToTuple (a :> b :> c :> d :> e :> f :> g :> h :> j :> k :> l :> Nil)
267+ = (a, b, c, d, e, f, g, h, j, k, l)
268+
269+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
270+ 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)
271+ tupleToList (a, b, c, d, e, f, g, h, j, k, l, m)
272+ = a :> b :> c :> d:> e :> f :> g :> h :> j :> k :> l :> m :> Nil
273+ listToTuple (a :> b :> c :> d :> e :> f :> g :> h :> j :> k :> l :> m :> Nil)
274+ = (a, b, c, d, e, f, g, h, j, k, l, m)
275+
276+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
277+ 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)
278+ tupleToList (a, b, c, d, e, f, g, h, j, k, l, m, n)
279+ = a :> b :> c :> d:> e :> f :> g :> h :> j :> k :> l :> m :> n :> Nil
280+ listToTuple (a :> b :> c :> d :> e :> f :> g :> h :> j :> k :> l :> m :> n :> Nil)
281+ = (a, b, c, d, e, f, g, h, j, k, l, m, n)
282+
283+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
284+ 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)
285+ tupleToList (a, b, c, d, e, f, g, h, j, k, l, m, n, o)
286+ = a :> b :> c :> d:> e :> f :> g :> h :> j :> k :> l :> m :> n :> o :> Nil
287+ listToTuple (a :> b :> c :> d :> e :> f :> g :> h :> j :> k :> l :> m :> n :> o :> Nil)
288+ = (a, b, c, d, e, f, g, h, j, k, l, m, n, o)
289+
290+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
291+ 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)
292+ tupleToList (a, b, c, d, e, f, g, h, j, k, l, m, n, o, p)
293+ = a :> b :> c :> d:> e :> f :> g :> h :> j :> k :> l :> m :> n :> o :> p :> Nil
294+ listToTuple (a :> b :> c :> d :> e :> f :> g :> h :> j :> k :> l :> m :> n :> o :> p :> Nil)
295+ = (a, b, c, d, e, f, g, h, j, k, l, m, n, o, p)
296+
297+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
298+ 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)
299+ tupleToList (a, b, c, d, e, f, g, h, j, k, l, m, n, o, p, q)
300+ = a :> b :> c :> d:> e :> f :> g :> h :> j :> k :> l :> m :> n :> o :> p :> q :> Nil
301+ listToTuple (a :> b :> c :> d :> e :> f :> g :> h :> j :> k :> l :> m :> n :> o :> p :> q :> Nil)
302+ = (a, b, c, d, e, f, g, h, j, k, l, m, n, o, p, q)
303+
304+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
305+ 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)
306+ tupleToList (a, b, c, d, e, f, g, h, j, k, l, m, n, o, p, q, r)
307+ = a :> b :> c :> d:> e :> f :> g :> h :> j :> k :> l :> m :> n :> o :> p :> q :> r :> Nil
308+ listToTuple (a :> b :> c :> d :> e :> f :> g :> h :> j :> k :> l :> m :> n :> o :> p :> q :> r :> Nil)
309+ = (a, b, c, d, e, f, g, h, j, k, l, m, n, o, p, q, r)
310+
311+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
312+ 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)
313+ tupleToList (a, b, c, d, e, f, g, h, j, k, l, m, n, o, p, q, r, s)
314+ = a :> b :> c :> d:> e :> f :> g :> h :> j :> k :> l :> m :> n :> o :> p :> q :> r :> s :> Nil
315+ listToTuple (a :> b :> c :> d :> e :> f :> g :> h :> j :> k :> l :> m :> n :> o :> p :> q :> r :> s :> Nil)
316+ = (a, b, c, d, e, f, g, h, j, k, l, m, n, o, p, q, r, s)
317+
318+type family TupleToList a where
319+ TupleToList () = '[]
320+ TupleToList (a, b) = '[ '( '(), a), '( '(), b)]
321+ TupleToList (a, b, c) = '[ '( '(), a), '( '(), b), '( '(), c)]
322+ TupleToList (a, b, c, d) = '[ '( '(), a), '( '(), b), '( '(), c), '( '(), d)]
323+ TupleToList (a, b, c, d, e) = '[ '( '(), a), '( '(), b), '( '(), c), '( '(), d), '( '(), e)]
324+ TupleToList (a, b, c, d, e, f) = '[ '( '(), a), '( '(), b), '( '(), c), '( '(), d), '( '(), e), '( '(), f)]
325+ TupleToList (a, b, c, d, e, f, g) = '[ '( '(), a), '( '(), b), '( '(), c), '( '(), d), '( '(), e), '( '(), f), '( '(), g)]
326+ TupleToList (a, b, c, d, e, f, g, h) = '[ '( '(), a), '( '(), b), '( '(), c), '( '(), d), '( '(), e), '( '(), f), '( '(), g), '( '(), h)]
327+ TupleToList (a, b, c, d, e, f, g, h, j) = '[ '( '(), a), '( '(), b), '( '(), c), '( '(), d), '( '(), e), '( '(), f), '( '(), g), '( '(), h), '( '(), j)]
328+ TupleToList (a, b, c, d, e, f, g, h, j, k) = '[ '( '(), a), '( '(), b), '( '(), c), '( '(), d), '( '(), e), '( '(), f), '( '(), g), '( '(), h), '( '(), j), '( '(), k)]
329+ TupleToList (a, b, c, d, e, f, g, h, j, k, l) = '[ '( '(), a), '( '(), b), '( '(), c), '( '(), d), '( '(), e), '( '(), f), '( '(), g), '( '(), h), '( '(), j), '( '(), k), '( '(), l)]
330+ 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)]
331+ 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)]
332+ 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)]
333+ 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)]
334+ 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)]
335+ 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)]
336+ 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)]
337+ TupleToList a = '[ '( '(), a)]