@@ -1,3 +1,4 @@
1+{-# OPTIONS_GHC -W #-}
12module Type.Alias (realias, rules, canonicalRealias, Rules) where
23
34import Control.Applicative ((<$>),(<*>))
@@ -30,10 +31,9 @@ localizer moduleImports = go
3031 go tipe =
3132 case tipe of
3233 Var _ -> tipe
33− EmptyRecord -> tipe
3434 Lambda t1 t2 -> Lambda (go t1) (go t2)
3535 Data name ts -> Data (localize name) (map go ts)
36− Record fs ext -> Record (map (second go) fs) (go ext)
36+ Record fs ext -> Record (map (second go) fs) ext
3737
3838 byMethod = foldr (\(n,m) d -> Map.insertWith (++) n [m] d)
3939 Map.empty moduleImports
@@ -83,10 +83,9 @@ canonicalRealias aliases tipe =
8383 tipe' =
8484 case tipe of
8585 Var _ -> tipe
86− EmptyRecord -> tipe
8786 Lambda t1 t2 -> Lambda (f t1) (f t2)
8887 Data name ts -> Data name (map f ts)
89− Record fs ext -> Record (map (second f) fs) (f ext)
88+ Record fs ext -> Record (map (second f) fs) ext
9089
9190allEqual [] = True
9291allEqual (x:xs) = all (==x) xs
@@ -102,8 +101,7 @@ bestType tipes = fst $ List.minimumBy (\a b -> compare (snd a) (snd b)) pairs
102101 Lambda t1 t2 -> numFields t1 + numFields t2
103102 Var _ -> 0
104103 Data _ ts -> sum (map numFields ts)
105− EmptyRecord -> 0
106− Record fields ext -> length fields + sum (map (numFields . snd) fields) + numFields ext
104+ Record fields _ -> length fields + sum (map (numFields . snd) fields)
107105
108106diff :: Type -> Type -> Maybe [(String,Type)]
109107diff general specific =
@@ -113,11 +111,11 @@ diff general specific =
113111 (Data gname gts, Data sname sts)
114112 | gname == sname && length gts == length sts ->
115113 concat <$> zipWithM diff gts sts
116− (EmptyRecord, EmptyRecord) -> Just []
117− (Record _ _, Record _ _) ->
118− let (gfs,gext) = collectRecords general
119− (sfs,sext) = collectRecords specific
120− gfields = collectFields gfs
114+ (Record [] Nothing, Record [] Nothing) -> Just []
115+ (Record _ _, Record [] Nothing) -> Nothing
116+ (Record [] Nothing, Record _ _) -> Nothing
117+ (Record gfs gext, Record sfs sext) ->
118+ let gfields = collectFields gfs
121119 sfields = collectFields sfs
122120
123121 overlap = Map.intersectionWith (\gs ss -> length gs == length ss) sfields gfields
@@ -126,10 +124,12 @@ diff general specific =
126124 case isAligned of
127125 False -> Nothing
128126 True -> let remaining = Map.difference sfields gfields
129− sext' = if Map.null remaining then sext else
130− Record (flattenFields remaining) sext
127+ sext' = case sext of
128+ Just x | Map.null remaining -> Var x
129+ _ -> Record (flattenFields remaining) sext
130+ gext' = maybe (Record [] Nothing) Var gext
131131 matchMap = Map.intersectionWith (zipWith diff) gfields sfields
132− in concat <$> sequence (diff gext sext' : concat (Map.elems matchMap))
132+ in concat <$> sequence (diff gext' sext' : concat (Map.elems matchMap))
133133 (_,_) -> Nothing
134134
135135collectFields fields =