1{-# OPTIONS_GHC -Wall #-}
10 , DependencyInterface(..)
20import Control.Monad (liftM, liftM3, liftM4, liftM5)
22import Data.Map.Strict ((!))
23import qualified Data.Map.Strict as Map
24import qualified Data.Map.Merge.Strict as Map
25import qualified Data.Name as Name
27import qualified AST.Canonical as Can
28import qualified AST.Utils.Binop as Binop
29import qualified Elm.Package as Pkg
30import qualified Reporting.Annotation as A
40 , _values :: Map.Map Name.Name Can.Annotation
41 , _unions :: Map.Map Name.Name Union
42 , _aliases :: Map.Map Name.Name Alias
43 , _binops :: Map.Map Name.Name Binop
50 | ClosedUnion Can.Union
51 | PrivateUnion Can.Union
56 = PublicAlias Can.Alias
57 | PrivateAlias Can.Alias
63 { _op_name :: Name.Name
64 , _op_annotation :: Can.Annotation
65 , _op_associativity :: Binop.Associativity
66 , _op_precedence :: Binop.Precedence
75fromModule :: Pkg.Name -> Can.Module -> Map.Map Name.Name Can.Annotation -> Interface
76fromModule home (Can.Module _ exports _ _ unions aliases binops _) annotations =
79 , _values = restrict exports annotations
80 , _unions = restrictUnions exports unions
81 , _aliases = restrictAliases exports aliases
82 , _binops = restrict exports (Map.map (toOp annotations) binops)
86restrict :: Can.Exports -> Map.Map Name.Name a -> Map.Map Name.Name a
87restrict exports dict =
89 Can.ExportEverything _ ->
92 Can.Export explicitExports ->
93 Map.intersection dict explicitExports
96toOp :: Map.Map Name.Name Can.Annotation -> Can.Binop -> Binop
97toOp types (Can.Binop_ associativity precedence name) =
98 Binop name (types ! name) associativity precedence
101restrictUnions :: Can.Exports -> Map.Map Name.Name Can.Union -> Map.Map Name.Name Union
102restrictUnions exports unions =
104 Can.ExportEverything _ ->
105 Map.map OpenUnion unions
107 Can.Export explicitExports ->
108 Map.merge onLeft onRight onBoth explicitExports unions
110 onLeft = Map.dropMissing
111 onRight = Map.mapMissing (\_ union -> PrivateUnion union)
112 onBoth = Map.zipWithMatched $ \_ (A.At _ export) union ->
114 Can.ExportUnionOpen -> OpenUnion union
115 Can.ExportUnionClosed -> ClosedUnion union
116 _ -> error "impossible exports discovered in restrictUnions"
119restrictAliases :: Can.Exports -> Map.Map Name.Name Can.Alias -> Map.Map Name.Name Alias
120restrictAliases exports aliases =
122 Can.ExportEverything _ ->
123 Map.map PublicAlias aliases
125 Can.Export explicitExports ->
126 Map.merge onLeft onRight onBoth explicitExports aliases
128 onLeft = Map.dropMissing
129 onRight = Map.mapMissing (\_ a -> PrivateAlias a)
130 onBoth = Map.zipWithMatched (\_ _ a -> PublicAlias a)
137toPublicUnion :: Union -> Maybe Can.Union
138toPublicUnion iUnion =
140 OpenUnion union -> Just union
141 ClosedUnion (Can.Union vars _ _ opts) -> Just (Can.Union vars [] 0 opts)
142 PrivateUnion _ -> Nothing
145toPublicAlias :: Alias -> Maybe Can.Alias
146toPublicAlias iAlias =
148 PublicAlias alias -> Just alias
149 PrivateAlias _ -> Nothing
153-- DEPENDENCY INTERFACE
156data DependencyInterface
160 (Map.Map Name.Name Can.Union)
161 (Map.Map Name.Name Can.Alias)
164public :: Interface -> DependencyInterface
169private :: Interface -> DependencyInterface
170private (Interface pkg _ unions aliases _) =
171 Private pkg (Map.map extractUnion unions) (Map.map extractAlias aliases)
174extractUnion :: Union -> Can.Union
177 OpenUnion union -> union
178 ClosedUnion union -> union
179 PrivateUnion union -> union
182extractAlias :: Alias -> Can.Alias
185 PublicAlias alias -> alias
186 PrivateAlias alias -> alias
189privatize :: DependencyInterface -> DependencyInterface
192 Public i -> private i
200instance Binary Interface where
201 get = liftM5 Interface get get get get get
202 put (Interface a b c d e) = put a >> put b >> put c >> put d >> put e
205instance Binary Union where
208 OpenUnion u -> putWord8 0 >> put u
209 ClosedUnion u -> putWord8 1 >> put u
210 PrivateUnion u -> putWord8 2 >> put u
215 0 -> liftM OpenUnion get
216 1 -> liftM ClosedUnion get
217 2 -> liftM PrivateUnion get
218 _ -> error "binary encoding of Union was corrupted"
221instance Binary Alias where
224 PublicAlias a -> putWord8 0 >> put a
225 PrivateAlias a -> putWord8 1 >> put a
230 0 -> liftM PublicAlias get
231 1 -> liftM PrivateAlias get
232 _ -> error "binary encoding of Alias was corrupted"
235instance Binary Binop where
237 liftM4 Binop get get get get
239 put (Binop a b c d) =
240 put a >> put b >> put c >> put d
243instance Binary DependencyInterface where
246 Public a -> putWord8 0 >> put a
247 Private a b c -> putWord8 1 >> put a >> put b >> put c
252 0 -> liftM Public get
253 1 -> liftM3 Private get get get
254 _ -> error "binary encoding of DependencyInterface was corrupted"
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list