module Type.Fragment where

import qualified Data.List as List
import qualified Data.Map as Map

import Type.Type
import SourceSyntax.Pattern
import SourceSyntax.Location (noneNoDocs)

data Fragment = Fragment {
    typeEnv        :: Map.Map String Type,
    vars           :: [Variable],
    typeConstraint :: TypeConstraint
} deriving Show

emptyFragment = Fragment Map.empty [] (noneNoDocs CTrue)

joinFragment f1 f2 = Fragment {
    typeEnv = Map.union (typeEnv f1) (typeEnv f2),
    vars    = vars f1 ++ vars f2,
    typeConstraint = typeConstraint f1 /\ typeConstraint f2
}

joinFragments = List.foldl' (flip joinFragment) emptyFragment


toScheme fragment =
    Scheme [] (vars fragment) (typeConstraint fragment) (typeEnv fragment)