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 qualified Data.Set as Set
17import qualified AST.Canonical as Can
18import qualified AST.Optimized as Opt
19import qualified AST.Module.Name as ModuleName
20import qualified AST.Utils.Type as Type
21import qualified Elm.Compiler.Type as T
22import qualified Elm.Interface as I
23import qualified Elm.Name as N
30fromAnnotation :: Can.Annotation -> T.Type
31fromAnnotation (Can.Forall _ astType) =
35fromType :: Can.Type -> T.Type
37 snd (run (extract astType))
40extract :: Can.Type -> Extractor T.Type
43 Can.TLambda arg result ->
51 Can.TType home name args ->
52 addUnion (Opt.Global home name) (T.Type (toPublicName home name))
53 <*> traverse extract args
55 Can.TRecord fields ext ->
56 do efields <- fmap Map.toList (traverse extract fields)
57 pure (T.Record efields ext)
62 Can.TTuple a b maybeC ->
66 <*> traverse extract (Maybe.maybeToList maybeC)
68 Can.TAlias home name args aliasType ->
69 do addAlias (Opt.Global home name) ()
70 _ <- extract (Type.dealias args aliasType)
71 T.Type (toPublicName home name)
72 <$> traverse (extract . snd) args
75toPublicName :: ModuleName.Canonical -> N.Name -> N.Name
76toPublicName (ModuleName.Canonical _ home) name =
77 N.sepBy 0x2E {- . -} home name
81-- EXTRACT MODEL, MSG, AND ANY TRANSITIVE DEPENDENCIES
84fromMsg :: I.Interfaces -> Can.Type -> T.DebugMetadata
85fromMsg interfaces message =
91 extractTransitive interfaces noDeps msgDeps
93 T.DebugMetadata msgType aliases unions
96extractTransitive :: I.Interfaces -> Deps -> Deps -> ( [T.Alias], [T.Union] )
97extractTransitive interfaces (Deps seenAliases seenUnions) (Deps nextAliases nextUnions) =
99 aliases = Set.difference nextAliases seenAliases
100 unions = Set.difference nextUnions seenUnions
102 if Set.null aliases && Set.null unions then
110 <$> traverse (extractAlias interfaces) (Set.toList aliases)
111 <*> traverse (extractUnion interfaces) (Set.toList unions)
114 Deps (Set.union seenAliases nextAliases) (Set.union seenUnions nextUnions)
117 extractTransitive interfaces oldDeps newDeps
119 mappend result remainingResult
122extractAlias :: I.Interfaces -> Opt.Global -> Extractor T.Alias
123extractAlias interfaces (Opt.Global home name) =
125 (I.Interface _ _ aliases _) = interfaces ! home
126 (Can.Alias args aliasType _) = aliases ! name
128 T.Alias (toPublicName home name) args <$> extract aliasType
131extractUnion :: I.Interfaces -> Opt.Global -> Extractor T.Union
132extractUnion interfaces (Opt.Global home name) =
134 pname = toPublicName home name
135 unions = I._unions (interfaces ! home)
137 case unions ! name of
138 Can.Union vars ctors _ _ ->
139 T.Union pname vars <$> traverse extractCtor ctors
142extractCtor :: Can.Ctor -> Extractor (N.Name, [T.Type])
143extractCtor (Can.Ctor ctor _ _ args) =
144 (,) ctor <$> traverse extract args
153 { _aliases :: Set.Set Opt.Global
154 , _unions :: Set.Set Opt.Global
158{-# NOINLINE noDeps #-}
161 Deps Set.empty Set.empty
172 -> Set.Set Opt.Global
173 -> (Set.Set Opt.Global -> Set.Set Opt.Global -> a -> result)
178run :: Extractor a -> (Deps, a)
180 k Set.empty Set.empty $ \aliases unions value ->
181 ( Deps aliases unions, value )
184addAlias :: Opt.Global -> a -> Extractor a
185addAlias alias value =
186 Extractor $ \aliases unions ok ->
187 ok (Set.insert alias aliases) unions value
190addUnion :: Opt.Global -> a -> Extractor a
191addUnion union value =
192 Extractor $ \aliases unions ok ->
193 ok aliases (Set.insert union unions) value
196instance Functor Extractor where
197 fmap func (Extractor k) =
198 Extractor $ \aliases unions ok ->
201 ok a1 u1 (func value)
206instance Applicative Extractor where
208 Extractor $ \aliases unions ok ->
209 ok aliases unions value
211 (<*>) (Extractor kf) (Extractor kv) =
212 Extractor $ \aliases unions ok ->
217 ok a2 u2 (func value)
221 kf aliases unions ok1
224instance Monad Extractor where
227 (>>=) (Extractor ka) callback =
228 Extractor $ \aliases unions ok ->
231 case callback value of
232 Extractor kb -> kb a1 u1 ok
234 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