@@ -22,8 +22,8 @@ module Language.PureScript.Sugar.CaseDeclarations (
22import Data.List (groupBy)
22import Data.List (groupBy)
23import Data.Generics (mkT, everywhere)
23import Data.Generics (mkT, everywhere)
25−import Control.Applicative ((<$>))
25+import Control.Applicative
26−import Control.Monad (forM, join, unless)
26+import Control.Monad ((<=<), forM, join, unless)
27import Control.Monad.Error.Class
27import Control.Monad.Error.Class
29import Language.PureScript.Names
29import Language.PureScript.Names
@@ -51,7 +51,13 @@ desugarAbs = everywhere (mkT replace)
51-- Replace all top-level binders with case expressions.
51-- Replace all top-level binders with case expressions.
53desugarCases :: [Declaration] -> Either String [Declaration]
53desugarCases :: [Declaration] -> Either String [Declaration]
54−desugarCases = fmap join . mapM toDecls . groupBy inSameGroup
54+desugarCases = desugarRest <=< fmap join . mapM toDecls . groupBy inSameGroup
56+ desugarRest :: [Declaration] -> Either String [Declaration]
57+ desugarRest ((TypeInstanceDeclaration constraints className tys ds) : rest) =
58+ (:) <$> (TypeInstanceDeclaration constraints className tys <$> desugarCases ds) <*> desugarRest rest
59+ desugarRest (d : ds) = (:) d <$> desugarRest ds
60+ desugarRest [] = pure []
56inSameGroup :: Declaration -> Declaration -> Bool
62inSameGroup :: Declaration -> Declaration -> Bool
57inSameGroup (ValueDeclaration ident1 _ _ _) (ValueDeclaration ident2 _ _ _) = ident1 == ident2
63inSameGroup (ValueDeclaration ident1 _ _ _) (ValueDeclaration ident2 _ _ _) = ident1 == ident2