packages feed

lol-typing-1.20160822: Language/LOL/Typing/Constraint/Either.hs

{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeFamilies #-}
{-# OPTIONS_GHC -fno-warn-tabs #-}
module Language.LOL.Typing.Constraint.Either where

import Data.Either (Either(..), either)
import Data.Function (($), (.))
import Data.Functor (Functor(..))
import Data.Text.Buildable (Buildable(..))
import Text.Show (Show(..))

import Language.LOL.Typing.Type
import Language.LOL.Typing.Solver

-- ** Type 'Constraint_Either'

newtype Constraint_Either f g info
 =      Constraint_Either (Either (f info) (g info))
 deriving (Show)

instance
 ( Buildable (f info)
 , Buildable (g info)
 ) => Buildable (Constraint_Either f g info) where
	build (Constraint_Either x) = either build build x
instance
 ( Functor f
 , Functor g
 ) => Functor (Constraint_Either f g) where
	fmap f (Constraint_Either x) =
		Constraint_Either $
		either (Left . fmap f) (Right . fmap f) x
instance
 ( Substitutable (f info)
 , Substitutable (g info)
 ) => Substitutable (Constraint_Either f g info) where
	subvars (Constraint_Either x) = either subvars subvars x
	substitute sub (Constraint_Either x) =
		Constraint_Either $
		either
		 (Left  . (sub `substitute`))
		 (Right . (sub `substitute`))
		 x
instance
 ( Solvable (f info) m
 , Solvable (g info) m
 ) => Solvable (Constraint_Either f g info) m where
	constraint_solver (Constraint_Either x) = either constraint_solver constraint_solver x
	constraint_checker (Constraint_Either x) = either constraint_checker constraint_checker x