module Language.Egison.Type.Instance
( findMatchingInstanceForType
) where
import Language.Egison.Type.Types (Type(..), TyVar(..), InstanceInfo(..), freeTyVars)
import Language.Egison.Type.Unify (unifyStrict)
findMatchingInstanceForType :: Type -> [InstanceInfo] -> Maybe InstanceInfo
findMatchingInstanceForType :: Type -> [InstanceInfo] -> Maybe InstanceInfo
findMatchingInstanceForType Type
targetType [InstanceInfo]
instances = [InstanceInfo] -> Maybe InstanceInfo
go [InstanceInfo]
instances
where
go :: [InstanceInfo] -> Maybe InstanceInfo
go [] = Maybe InstanceInfo
forall a. Maybe a
Nothing
go (InstanceInfo
inst:[InstanceInfo]
rest) =
case Type -> Type -> Either UnifyError Subst
unifyStrict (InstanceInfo -> Type
instType InstanceInfo
inst) Type
targetType of
Right Subst
_ -> InstanceInfo -> Maybe InstanceInfo
forall a. a -> Maybe a
Just InstanceInfo
inst
Left UnifyError
_ -> [InstanceInfo] -> Maybe InstanceInfo
go [InstanceInfo]
rest