+Note [Indexed data types]
+~~~~~~~~~~~~~~~~~~~~~~~~~
+Consider
+ data family T :: * -> *
+ data T Int = TI Int
+
+ f :: T Int -> Bool
+ f x = case x of { DEFAULT -> <body> }
+
+We would like to change this to
+ f x = case x `cast` co of { TI p -> <body> }
+
+so that <body> can make use of the fact that x is already evaluated to
+a TI; and a case on a known data type may be more efficient than a
+polymorphic one (not sure this is true any longer). Anyway the former
+showed up in Roman's experiments. Example:
+ foo :: FooT Int -> Int -> Int
+ foo t n = t `seq` bar n
+ where
+ bar 0 = 0
+ bar n = bar (n - case t of TI i -> i)
+Here we'd like to avoid repeated evaluating t inside the loop, by
+taking advantage of the `seq`.
+
+We implement this as part of the liberate-case transformation by
+spotting
+ case <scrut> of (x::T) tys { DEFAULT -> <body> }
+where x :: T tys, and T is a indexed family tycon. Find the
+representation type (T77 tys'), and coercion co, and transform to
+ case <scrut> `cast` co of (y::T77 tys')
+ DEFAULT -> let x = y `cast` sym co in <body>
+
+The "find the representation type" part is done by looking up in the
+family-instance environment.
+
+NB: in fact we re-use x (changing its type) to avoid making a fresh y;
+this entails shadowing, but that's ok.
+
+%************************************************************************
+%* *
+ Top-level code
+%* *
+%************************************************************************