elm-compiler-0.14: src/Transform/Interface.hs
module Transform.Interface (filterExports) where
import qualified Data.Map as Map
import qualified Data.Maybe as Maybe
import qualified AST.Module as Module
import qualified AST.Variable as Var
filterExports :: Module.Interface -> Module.Interface
filterExports interface =
interface
{ Module.iTypes =
Map.fromList $
Maybe.mapMaybe
(get (Module.iTypes interface))
(Var.getValues exports ++ ctors)
, Module.iAliases =
Map.fromList $
Maybe.mapMaybe
(get (Module.iAliases interface))
(Var.getAliases exports)
, Module.iAdts =
Map.fromList
(Maybe.mapMaybe (trimUnions interface) unions)
}
where
exports :: [Var.Value]
exports =
Module.iExports interface
unions :: [(String, Var.Listing String)]
unions =
Var.getUnions exports
ctors :: [String]
ctors =
concatMap (\(_, Var.Listing ctorList _) -> ctorList) unions
get :: Map.Map String a -> String -> Maybe (String, a)
get dict key =
case Map.lookup key dict of
Nothing -> Nothing
Just value -> Just (key, value)
trimUnions
:: Module.Interface
-> (String, Var.Listing String)
-> Maybe (String, Module.AdtInfo String)
trimUnions interface (name, Var.Listing exportedCtors _) =
case Map.lookup name (Module.iAdts interface) of
Nothing -> Nothing
Just (tvars, ctors) ->
let isExported (ctor, _) =
ctor `elem` exportedCtors
in
Just (name, (tvars, filter isExported ctors))