on c19392f help sign in
57 lines 1.6 kB history raw
1{-# OPTIONS_GHC -Wall #-}
2{-# LANGUAGE OverloadedStrings #-}
3module Canonicalize.Type
4 ( canonicalize
5 )
6 where
9import qualified Data.Map as Map
11import qualified AST.Type as Type
12import qualified Canonicalize.Environment.Dups as Dups
13import qualified Canonicalize.Environment.Internals as Env
14import qualified Reporting.Annotation as A
15import qualified Reporting.Result as Result
19-- CANONICALIZE TYPES
22canonicalize :: Env.Env -> Type.Raw -> Env.Result Type.Canonical
23canonicalize env (A.A _ tipe) =
24 case tipe of
25 Type.RVar x ->
26 Result.ok (Type.Var x)
28 Type.RType region maybePrefix name args ->
29 do info <- Env.findType region env maybePrefix name (length args)
30 cargs <- traverse (canonicalize env) args
31 return $
32 case info of
33 Env.Alias home argNames aliasedType ->
34 Type.Aliased home name (zip argNames cargs) (Type.Holey aliasedType)
36 Env.Union home ->
37 Type.Type home name cargs
39 Type.RLambda a b ->
40 Type.Lambda
41 <$> canonicalize env a
42 <*> canonicalize env b
44 Type.RRecord fields ext ->
45 do fieldDict <- Dups.checkFields fields
46 Type.Record
47 <$> Map.traverseWithKey (\_ t -> canonicalize env t) fieldDict
48 <*> traverse (canonicalize env) ext
50 Type.RUnit ->
51 Result.ok Type.Unit
53 Type.RTuple a b cs ->
54 Type.Tuple
55 <$> canonicalize env a
56 <*> canonicalize env b
57 <*> traverse (canonicalize env) cs