32 lines
1.2 KiB
Haskell
32 lines
1.2 KiB
Haskell
module Types.Hints (hints) where
|
|
|
|
import Control.Arrow (first)
|
|
import Control.Monad (liftM)
|
|
import Data.Maybe (catMaybes)
|
|
import qualified Data.Map as Map
|
|
import Guid
|
|
import qualified Libraries as Libs
|
|
import Parse.Library (iParse)
|
|
import Parse.Types
|
|
import qualified Types.Substitutions as Subs
|
|
import Types.Types
|
|
|
|
hints :: GuidCounter [(String, Scheme)]
|
|
hints = liftM catMaybes (mapM toScheme values)
|
|
where
|
|
values :: [(String, String)]
|
|
values = addPrefixes (Map.toList (Map.map Map.toList Libs.libraries))
|
|
|
|
addPrefixes :: [(String,[(String, String)])] -> [(String, String)]
|
|
addPrefixes = concatMap (\(m,vs) -> map (first (\n -> m ++ "." ++ n)) vs)
|
|
|
|
toScheme :: (String, String) -> GuidCounter (Maybe (String, Scheme))
|
|
toScheme (name, 't':'y':'p':'e':' ':_) = return Nothing
|
|
toScheme (name, 'd':'a':'t':'a':' ':_) = return Nothing
|
|
toScheme (name, tipeString) =
|
|
let err = "compiler error parsing type of " ++ name ++ ":\n" ++ tipeString
|
|
in case iParse (fmap toType typeExpr) err tipeString of
|
|
Left err -> error (show err)
|
|
Right tipe -> do
|
|
scheme <- Subs.generalize [] =<< Subs.superize name tipe
|
|
return (Just (name, scheme))
|