on d87affe help sign in
elk/src/Transform/AddDefaultImports.hs
86 lines 2.3 kB history raw
1{-# LANGUAGE FlexibleContexts #-}
2module Transform.AddDefaultImports (add, defaultImports) where
4import Prelude hiding (maybe)
5import qualified Data.Map as Map
7import qualified AST.Module as Module
8import qualified AST.Variable as Var
11type ImportDict =
12 Map.Map Module.Name ([String], Var.Listing Var.Value)
15-- DESCRIPTION OF DEFAULT IMPORTS
17(==>) :: a -> b -> (a,b)
18(==>) = (,)
21defaultImports :: ImportDict
22defaultImports =
23 Map.fromList
24 [ ["Basics"] ==> ([], Var.openListing)
25 , ["Maybe"] ==> ([], Var.Listing [maybe] False)
26 , ["Result"] ==> ([], Var.Listing [result] False)
27 , ["Signal"] ==> ([], Var.Listing [signal] False)
28 ]
31maybe :: Var.Value
32maybe =
33 Var.ADT "Maybe" Var.openListing
36result :: Var.Value
37result =
38 Var.ADT "Result" Var.openListing
41signal :: Var.Value
42signal =
43 Var.ADT "Signal" (Var.Listing [] False)
46-- ADDING DEFAULT IMPORTS TO A MODULE
48add :: Bool -> Module.Module exs body -> Module.Module exs body
49add needsDefaults (Module.Module moduleName path exports imports decls) =
50 Module.Module moduleName path exports ammendedImports decls
51 where
52 ammendedImports =
53 importDictToList $
54 foldr addImport (if needsDefaults then defaultImports else Map.empty) imports
57importDictToList :: ImportDict -> [(Module.Name, Module.ImportMethod)]
58importDictToList dict =
59 concatMap toImports (Map.toList dict)
60 where
61 toImports (name, (qualifiers, listing@(Var.Listing explicits open))) =
62 map (\qualifier -> (name, Module.As qualifier)) qualifiers
63 ++
64 if open || not (null explicits)
65 then [(name, Module.Open listing)]
66 else []
69addImport :: (Module.Name, Module.ImportMethod) -> ImportDict -> ImportDict
70addImport (name, method) importDict =
71 Map.alter mergeMethods name importDict
72 where
73 mergeMethods :: Maybe ([String], Var.Listing Var.Value)
74 -> Maybe ([String], Var.Listing Var.Value)
75 mergeMethods entry =
76 let (qualifiers, listing) =
77 case entry of
78 Nothing -> ([], Var.Listing [] False)
79 Just v -> v
80 in
81 case method of
82 Module.As qualifier ->
83 Just (qualifier : qualifiers, listing)
85 Module.Open newListing ->
86 Just (qualifiers, newListing)