2016-01-04 17:25:37 +03:00
|
|
|
{-# LANGUAGE FlexibleInstances #-}
|
2016-02-04 21:59:33 +03:00
|
|
|
module Category where
|
2015-11-18 22:23:35 +03:00
|
|
|
|
2015-11-27 20:02:15 +03:00
|
|
|
import Term
|
|
|
|
import Control.Comonad.Cofree
|
2015-11-18 22:23:35 +03:00
|
|
|
import Data.Set
|
|
|
|
|
2016-02-05 00:35:42 +03:00
|
|
|
-- | A standardized category of AST node. Used to determine the semantics for
|
|
|
|
-- | semantic diffing and define comparability of nodes.
|
|
|
|
data Category =
|
|
|
|
-- | A literal key-value data structure.
|
|
|
|
DictionaryLiteral
|
|
|
|
-- | A non-standard category, which can be used for comparability.
|
|
|
|
| Other String
|
|
|
|
deriving Eq
|
|
|
|
|
2016-01-14 17:17:12 +03:00
|
|
|
-- | The class of types that have categories.
|
2015-11-18 22:23:35 +03:00
|
|
|
class Categorizable a where
|
|
|
|
categories :: a -> Set String
|
2015-11-18 22:25:53 +03:00
|
|
|
|
2015-11-27 20:02:15 +03:00
|
|
|
instance Categorizable annotation => Categorizable (Term a annotation) where
|
|
|
|
categories (annotation :< _) = categories annotation
|
|
|
|
|
2016-01-14 17:17:12 +03:00
|
|
|
-- | Test whether the categories from the categorizables intersect.
|
2015-11-18 22:25:53 +03:00
|
|
|
comparable :: Categorizable a => a -> a -> Bool
|
2015-12-09 18:59:13 +03:00
|
|
|
comparable a b = catsA == catsB || (not . Data.Set.null $ intersection catsA catsB)
|
|
|
|
where
|
|
|
|
catsA = categories a
|
|
|
|
catsB = categories b
|