@@ -1,337 +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− ) 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)]