1{-# OPTIONS_GHC -Wall #-}
2{-# LANGUAGE OverloadedStrings #-}
3module Canonicalize.Type
10import qualified Data.List as List
11import qualified Data.Map as Map
13import qualified AST.Canonical as Can
14import qualified AST.Source as Src
15import qualified Canonicalize.Environment as Env
16import qualified Canonicalize.Environment.Dups as Dups
17import qualified Elm.Name as N
18import qualified Reporting.Annotation as A
19import qualified Reporting.Error.Canonicalize as Error
20import qualified Reporting.Region as R
21import qualified Reporting.Result as Result
29 Result.Result i w Error.Error a
36toAnnotation :: Env.Env -> Src.Type -> Result i w Can.Annotation
37toAnnotation env srcType =
38 do tipe <- canonicalize env srcType
39 Result.ok $ Can.Forall (addFreeVars Map.empty tipe) tipe
46canonicalize :: Env.Env -> Src.Type -> Result i w Can.Type
47canonicalize env (A.At typeRegion tipe) =
50 Result.ok (Can.TVar x)
52 Src.TType region name args ->
53 canonicalizeType env typeRegion name args =<<
54 Env.findType region env name
56 Src.TTypeQual region home name args ->
57 canonicalizeType env typeRegion name args =<<
58 Env.findTypeQual region env home name
62 <$> canonicalize env a
63 <*> canonicalize env b
65 Src.TRecord fields ext ->
66 do fieldDict <- Dups.checkFields fields
68 <$> traverse (canonicalize env) fieldDict
69 <*> traverse (canonicalize env) ext
76 <$> canonicalize env a
77 <*> canonicalize env b
84 Just <$> canonicalize env c
87 Result.throw $ Error.TupleLargerThanThree typeRegion
94canonicalizeType :: Env.Env -> R.Region -> N.Name -> [Src.Type] -> Env.Type -> Result i w Can.Type
95canonicalizeType env region name args info =
96 do cargs <- traverse (canonicalize env) args
98 Env.Alias arity home argNames aliasedType ->
99 checkArity arity region name args $
100 Can.TAlias home name (zip argNames cargs) (Can.Holey aliasedType)
102 Env.Union arity home ->
103 checkArity arity region name args $
104 Can.TType home name cargs
107checkArity :: Int -> R.Region -> N.Name -> [A.Located arg] -> answer -> Result i w answer
108checkArity expected region name args answer =
109 let actual = length args in
110 if expected == actual then
113 Result.throw (Error.BadArity region Error.TypeArity name expected actual)
120addFreeVars :: Map.Map N.Name () -> Can.Type -> Map.Map N.Name ()
121addFreeVars freeVars tipe =
123 Can.TLambda arg result ->
124 addFreeVars (addFreeVars freeVars result) arg
127 Map.insert var () freeVars
129 Can.TType _ _ args ->
130 List.foldl' addFreeVars freeVars args
132 Can.TRecord fields Nothing ->
133 Map.foldl addFreeVars freeVars fields
135 Can.TRecord fields (Just ext) ->
136 Map.foldl addFreeVars (addFreeVars freeVars ext) fields
141 Can.TTuple a b maybeC ->
144 addFreeVars (addFreeVars freeVars a) b
147 addFreeVars (addFreeVars (addFreeVars freeVars a) b) c
149 Can.TAlias _ _ args _ ->
150 List.foldl' (\fvs (_,arg) -> addFreeVars fvs arg) freeVars args
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