1{-# OPTIONS_GHC -Wall #-}
2{-# LANGUAGE OverloadedStrings #-}
3{-# LANGUAGE Rank2Types #-}
4module Elm.Compiler.Type.Extract
13import qualified Data.Map as Map
14import qualified Data.Maybe as Maybe
15import Data.Monoid ((<>))
16import qualified Data.Set as Set
18import qualified AST.Canonical as Can
19import qualified AST.Optimized as Opt
20import qualified AST.Module.Name as ModuleName
21import qualified AST.Utils.Type as Type
22import qualified Elm.Compiler.Type as T
23import qualified Elm.Interface as I
24import qualified Elm.Name as N
31fromAnnotation :: Can.Annotation -> T.Type
32fromAnnotation (Can.Forall _ astType) =
36fromType :: Can.Type -> T.Type
38 snd (run (extract astType))
41extract :: Can.Type -> Extractor T.Type
44 Can.TLambda arg result ->
52 Can.TType home name args ->
53 addUnion (Opt.Global home name) (T.Type (toPublicName home name))
54 <*> traverse extract args
56 Can.TRecord fields ext ->
58 <$> fmap Map.toList (traverse extract fields)
59 <*> traverse extract ext
64 Can.TTuple a b maybeC ->
68 <*> traverse extract (Maybe.maybeToList maybeC)
70 Can.TAlias home name args aliasType ->
71 do addAlias (Opt.Global home name) ()
72 _ <- extract (Type.dealias args aliasType)
73 T.Type (toPublicName home name)
74 <$> traverse (extract . snd) args
77toPublicName :: ModuleName.Canonical -> N.Name -> N.Name
78toPublicName (ModuleName.Canonical _ home) name =
83-- EXTRACT MODEL, MSG, AND ANY TRANSITIVE DEPENDENCIES
86fromMsg :: I.Interfaces -> Can.Type -> T.DebugMetadata
87fromMsg interfaces message =
93 extractTransitive interfaces noDeps msgDeps
95 T.DebugMetadata msgType aliases unions
98extractTransitive :: I.Interfaces -> Deps -> Deps -> ( [T.Alias], [T.Union] )
99extractTransitive interfaces (Deps seenAliases seenUnions) (Deps nextAliases nextUnions) =
101 aliases = Set.difference nextAliases seenAliases
102 unions = Set.difference nextUnions seenUnions
104 if Set.null aliases && Set.null unions then
112 <$> traverse (extractAlias interfaces) (Set.toList aliases)
113 <*> traverse (extractUnion interfaces) (Set.toList unions)
116 Deps (Set.union seenAliases nextAliases) (Set.union seenUnions nextUnions)
119 extractTransitive interfaces oldDeps newDeps
121 mappend result remainingResult
124extractAlias :: I.Interfaces -> Opt.Global -> Extractor T.Alias
125extractAlias interfaces (Opt.Global home name) =
127 (I.Interface _ _ aliases _) = interfaces ! home
128 (Can.Alias args aliasType _) = aliases ! name
130 T.Alias (toPublicName home name) args <$> extract aliasType
133extractUnion :: I.Interfaces -> Opt.Global -> Extractor T.Union
134extractUnion interfaces (Opt.Global home name) =
136 pname = toPublicName home name
137 unions = I._unions (interfaces ! home)
139 case unions ! name of
140 Can.Union vars ctors _ _ ->
141 T.Union pname vars <$> traverse extractCtor ctors
144extractCtor :: Can.Ctor -> Extractor (N.Name, [T.Type])
145extractCtor (Can.Ctor ctor _ _ args) =
146 (,) ctor <$> traverse extract args
155 { _aliases :: Set.Set Opt.Global
156 , _unions :: Set.Set Opt.Global
160{-# NOINLINE noDeps #-}
163 Deps Set.empty Set.empty
174 -> Set.Set Opt.Global
175 -> (Set.Set Opt.Global -> Set.Set Opt.Global -> a -> result)
180run :: Extractor a -> (Deps, a)
182 k Set.empty Set.empty $ \aliases unions value ->
183 ( Deps aliases unions, value )
186addAlias :: Opt.Global -> a -> Extractor a
187addAlias alias value =
188 Extractor $ \aliases unions ok ->
189 ok (Set.insert alias aliases) unions value
192addUnion :: Opt.Global -> a -> Extractor a
193addUnion union value =
194 Extractor $ \aliases unions ok ->
195 ok aliases (Set.insert union unions) value
198instance Functor Extractor where
199 fmap func (Extractor k) =
200 Extractor $ \aliases unions ok ->
203 ok a1 u1 (func value)
208instance Applicative Extractor where
210 Extractor $ \aliases unions ok ->
211 ok aliases unions value
213 (<*>) (Extractor kf) (Extractor kv) =
214 Extractor $ \aliases unions ok ->
219 ok a2 u2 (func value)
223 kf aliases unions ok1
226instance Monad Extractor where
229 (>>=) (Extractor ka) callback =
230 Extractor $ \aliases unions ok ->
233 case callback value of
234 Extractor kb -> kb a1 u1 ok
236 ka aliases unions ok1
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