module Grakn.Pattern
( Pattern
, var_
, isa
, (<:)
, has
) where
import Grakn.Property (Label, Property (Has, Isa, Rel), RolePlayer,
Value, Var, VarOrLabel)
import Grakn.Util (Convert (convert), spaces, with)
data Pattern =
Pattern (Maybe VarOrLabel)
[Property]
var_ :: Pattern
var_ = Pattern Nothing []
isa :: (Convert p Pattern, Convert a VarOrLabel) => p -> a -> Pattern
patt `isa` x = addProperty patt (Isa $ convert x)
(<:) :: (Convert p Pattern, Convert a RolePlayer) => p -> [a] -> Pattern
patt <: cs = addProperty patt (Rel $ map convert cs)
has ::
(Convert p Pattern, Convert a (Either Value Var))
=> p
-> Label
-> a
-> Pattern
has patt rt v = addProperty patt (Has rt $ convert v)
showProps :: Show a => [a] -> String
showProps = spaces . reverse
addPropToPattern :: Pattern -> Property -> Pattern
addPropToPattern (Pattern n props) prop = Pattern n (prop : props)
addProperty :: Convert a Pattern => a -> Property -> Pattern
addProperty = addPropToPattern . convert
instance Show Pattern where
show (Pattern v []) = v `with` "" ++ ";"
show (Pattern v props) = v `with` " " ++ showProps props ++ ";"
instance Convert Var Pattern where
convert = convert . (convert :: Var -> VarOrLabel)
instance Convert Label Pattern where
convert = convert . (convert :: Label -> VarOrLabel)
instance Convert VarOrLabel Pattern where
convert v = Pattern (Just v) []