caseU :: (Monad m, Monoid r)
  => Translate m [C.CoreContext] C.Term r
  -> Translate m [C.CoreContext] C.Term r
  -> Translate m [C.CoreContext] C.Term r
caseU rr1 rr2 = translate $ \e -> case e of
  (C.Case scrut t alts) -> liftM2 mappend (apply C.Other rr1 scrut) (liftM mconcat (mapM (apply C.CaseAlt rr2 . snd) alts))
  _                     -> fail "caseU"
caseU :: (Monad m, Monoid r)
  => Translate m [C.CoreContext] C.Term r
  -> Translate m [C.CoreContext] C.Term r
  -> Translate m [C.CoreContext] C.Term r
caseU rr1 rr2 = translate $ \e -> case e of
  (C.Case scrut t alts) -> liftM2 mappend (apply C.Other rr1 scrut) (liftM mconcat (mapM (apply C.CaseAlt rr2 . snd) alts))
  _                     -> fail "caseU"
caseU rr1 rr2 = translate $ \e -> case e of
  (C.Case scrut t alts) -> liftM2 mappend (apply C.Other rr1 scrut) (liftM mconcat (mapM (apply C.CaseAlt rr2 . snd) alts))
  _                     -> fail "caseU"