syfco-1.1.0.0: src/Writer/Data.hs
-----------------------------------------------------------------------------
-- |
-- Module : Writer.Data
-- License : MIT (see the LICENSE file)
-- Maintainer : Felix Klein (klein@react.uni-saarland.de)
--
-- Common data used by the writer module.
--
-----------------------------------------------------------------------------
{-# LANGUAGE
LambdaCase
, MultiParamTypeClasses
, TypeSynonymInstances
, FlexibleInstances
#-}
-----------------------------------------------------------------------------
module Writer.Data
( WriteMode(..)
, OperatorConfig(..)
, UnaryOperator(..)
, BinaryOperator(..)
, Unsupported(..)
, Assoc(..)
) where
-----------------------------------------------------------------------------
import Data.Convertible
( Convertible(..)
, ConvertError(..)
)
-----------------------------------------------------------------------------
-- | There are two writing modes currently supported:
data WriteMode =
Pretty
-- ^ pretty printing, producing a well readable, minimal ouptut
| Fully
-- ^ fully paranthesized printing, producing fully parenthesized
-- expressions
deriving (Eq, Ord)
-----------------------------------------------------------------------------
instance Convertible WriteMode String where
safeConvert = return . \case
Pretty -> "pretty"
Fully -> "fully"
-----------------------------------------------------------------------------
instance Convertible String WriteMode where
safeConvert = \case
"pretty" -> return Pretty
"fully" -> return Fully
str -> Left ConvertError
{ convSourceValue = str
, convSourceType = "String"
, convDestType = "WriteMode"
, convErrorMessage = "Unknown mode"
}
-----------------------------------------------------------------------------
-- | Associativity type to distinguis left associative operators from
-- right associative operators
data Assoc =
AssocLeft
| AssocRight
deriving (Eq)
-----------------------------------------------------------------------------
-- | A unary operator can be set up by providing a name and its precedence.
data UnaryOperator =
UnaryOp
{ uopName :: String
, uopPrecedence :: Int
}
| UnaryOpUnsupported
deriving (Eq)
-----------------------------------------------------------------------------
-- | A binary operator can be set up by a name, its precedencs and its
-- associativity.
data BinaryOperator =
BinaryOp
{ bopName :: String
, bopPrecedence :: Int
, bopAssoc :: Assoc
}
| BinaryOpUnsupported
deriving (Eq)
-----------------------------------------------------------------------------
-- | A simple expression printer can be set up using the function
-- 'printFormula' from 'Writer.Pretty'. The bundle the specific
-- operator names, their precedence and their associativity, the data
-- structure @OperatorNames@ is used.
--
-- Thereby, constants as True and False are given by Strings and unary
-- operators are given by their name their precedence. For binary
-- operators, additionally the associativity has to be defined.
--
-- The precedence is given by an Integer, where a lower value means
-- higher precedence. If the same value is used for multiple
-- operators, their precedence is treated equally.
--
-- The associativity is either 'AssocLeft' or 'AssocRight'.
--
-- Unsupported Operators can be disabled using 'UnaryOpUnsupported' or
-- 'BinaryOpUnsupported', respectively.
data OperatorConfig =
OperatorConfig
{ tTrue :: String
, fFalse :: String
, opNot :: UnaryOperator
, opAnd :: BinaryOperator
, opOr :: BinaryOperator
, opImplies :: BinaryOperator
, opEquiv :: BinaryOperator
, opNext :: UnaryOperator
, opFinally :: UnaryOperator
, opGlobally :: UnaryOperator
, opUntil :: BinaryOperator
, opRelease :: BinaryOperator
, opWeak :: BinaryOperator
} deriving (Eq)
-----------------------------------------------------------------------------
-- | Unification class to check whether an operator is unsupported or not.
class Unsupported a where
unsupported :: a -> Bool
instance Unsupported UnaryOperator where
unsupported = (== UnaryOpUnsupported)
instance Unsupported BinaryOperator where
unsupported = (== BinaryOpUnsupported)
-----------------------------------------------------------------------------