@@ -1,343 +0,0 @@
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)]