lol-typing-1.20160822: Language/LOL/Typing/Constraint/Extra.hs
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeFamilies #-}
{-# OPTIONS_GHC -fno-warn-tabs #-}
module Language.LOL.Typing.Constraint.Extra where
import Data.Function (($))
import Data.Functor (Functor(..))
import Data.Monoid ((<>))
import Data.Text.Buildable (Buildable(..))
import Text.Show (Show(..))
import Language.LOL.Typing.Type
import Language.LOL.Typing.Solver
-- * Type 'Constraint_Extra'
data Constraint_Extra info
= Constraint_Extra_ToProve Class_Qualifier info
| Constraint_Extra_Assume Class_Qualifier info
deriving (Show)
instance Functor Constraint_Extra where
fmap f c =
case c of
Constraint_Extra_ToProve p info -> Constraint_Extra_ToProve p (f info)
Constraint_Extra_Assume p info -> Constraint_Extra_Assume p (f info)
instance Buildable info => Buildable (Constraint_Extra info) where
build c =
case c of
Constraint_Extra_ToProve p info ->
build $ Infoed info $ "Prove (" <> build p <> ")"
Constraint_Extra_Assume p info ->
build $ Infoed info $ "Assume (" <> build p <> ")"
instance Substitutable (Constraint_Extra info) where
subvars c =
case c of
Constraint_Extra_ToProve p _ -> subvars p
Constraint_Extra_Assume p _ -> subvars p
sub `substitute` c =
case c of
Constraint_Extra_ToProve p info -> Constraint_Extra_ToProve (sub `substitute` p) info
Constraint_Extra_Assume p info -> Constraint_Extra_Assume (sub `substitute` p) info
instance
( info ~ Info m
, Show info
, Buildable info
, Solver_Class m
) => Solvable (Constraint_Extra info) m where
constraint_solver c =
case c of
Constraint_Extra_ToProve p info -> class_qualifier_toprove info p
Constraint_Extra_Assume p info -> class_qualifier_assume info p