| -- | |
| -- Module : Minigent.TC.Normalise |
| -- Copyright : (c) Data61 2018-2019 |
| -- Commonwealth Science and Research Organisation (CSIRO) |
| -- ABN 41 687 119 230 |
| -- License : BSD3 |
| -- |
| -- The normalise rewrite for types, which applies type operators. |
| -- |
| -- May be used qualified or unqualified. |
| module Minigent.TC.Normalise (normaliseConstraints) where |
| import Data.List (nub) |
| import Minigent.Syntax |
| import Minigent.Syntax.Utils |
| import Minigent.Syntax.Utils.Rewrite |
| import qualified Minigent.Syntax.Utils.Row as Row |
| |
| import qualified Data.Map as M |
| |
| normaliseRW :: Rewrite Type |
| normaliseRW = rewrite $ \t -> --trace ("Norm about to look at type:\n" ++ debugPrettyType t) $ |
| case t of |
| Bang (Function t1 t2) -> Just (Function t1 t2) |
| Bang (AbsType n s ts) -> Just (AbsType n (bangSigil s) (map Bang ts)) |
| Bang (TypeVar a) -> Just (TypeVarBang a) |
| Bang (TypeVarBang a) -> Just (TypeVarBang a) |
| Bang (RecPar a ctxt) -> Just (RecParBang a ctxt) |
| Bang (RecParBang a ctxt) -> Just (RecParBang a ctxt) |
| Bang (PrimType t) -> Just (PrimType t) |
| Bang (Variant r) | rowVar r == Nothing |
| -> Just (Variant (Row.mapEntries (entryTypes Bang) r)) |
| Bang (Record n r s) | rowVar r == Nothing, s == ReadOnly || s == Writable || s == Unboxed |
| -> Just (Record n (Row.mapEntries (entryTypes Bang) r) (bangSigil s)) |
| |
| _ -> Nothing |
| where |
| bangSigil Writable = ReadOnly |
| bangSigil x = x |
| |
| -- | Normalise all types within a set of constraints |
| normaliseConstraints :: [Constraint] -> [Constraint] |
| normaliseConstraints = nub . map (constraintTypes (normaliseType normaliseRW)) |