@@ -38,7 +38,7 @@ import Control.Applicative
38import Control.Arrow (first, second)
38import Control.Arrow (first, second)
39import Control.Monad.Except
39import Control.Monad.Except
40import Control.Monad.State
40import Control.Monad.State
41−import Data.List ((\\), find)
41+import Data.List ((\\), find, sortBy)
42import Data.Maybe (catMaybes, mapMaybe, isJust)
42import Data.Maybe (catMaybes, mapMaybe, isJust)
44import qualified Data.Map as M
44import qualified Data.Map as M
@@ -56,8 +56,14 @@ desugarTypeClasses = flip evalStateT M.empty . mapM desugarModule
57desugarModule :: (Functor m, Applicative m, MonadSupply m, MonadError ErrorStack m) => Module -> Desugar m Module
57desugarModule :: (Functor m, Applicative m, MonadSupply m, MonadError ErrorStack m) => Module -> Desugar m Module
58desugarModule (Module coms name decls (Just exps)) = do
58desugarModule (Module coms name decls (Just exps)) = do
59− (newExpss, declss) <- unzip <$> parU decls (desugarDecl name exps)
59+ (newExpss, declss) <- unzip <$> parU (sortBy classesFirst decls) (desugarDecl name exps)
60 return $ Module coms name (concat declss) $ Just (exps ++ catMaybes newExpss)
60 return $ Module coms name (concat declss) $ Just (exps ++ catMaybes newExpss)
62+ classesFirst :: Declaration -> Declaration -> Ordering
64+ | isTypeClassDeclaration d1 && not (isTypeClassDeclaration d2) = LT
65+ | not (isTypeClassDeclaration d1) && isTypeClassDeclaration d2 = GT
61desugarModule _ = error "Exports should have been elaborated in name desugaring"
67desugarModule _ = error "Exports should have been elaborated in name desugaring"
63{- Desugar type class and type class instance declarations
69{- Desugar type class and type class instance declarations