module Graql.Pattern
( Pattern
, IsPattern
, var_
, isa
, (<:)
, has
, toPattern
) where
import Graql.Util
import Graql.Property
data Pattern = Pattern (Maybe VarOrName) [Property]
class IsPattern a where
toPattern :: a -> Pattern
var_ :: Pattern
var_ = Pattern Nothing []
isa :: (IsPattern p, IsVarOrName a) => p -> a -> Pattern
patt `isa` x = addProperty patt (Isa $ toVarOrName x)
(<:) :: (IsPattern p, IsRolePlayer a) => p -> [a] -> Pattern
patt <: cs = addProperty patt (Rel $ map toRolePlayer cs)
has :: (IsPattern p, IsResource a) => p -> Name -> a -> Pattern
has patt rt v = addProperty patt (Has rt $ toResource v)
showProps :: Show a => [a] -> String
showProps = spaces . reverse
addPropToPattern :: Pattern -> Property -> Pattern
addPropToPattern (Pattern name props) prop = Pattern name (prop : props)
addProperty :: IsPattern a => a -> Property -> Pattern
addProperty = addPropToPattern . toPattern
instance Show Pattern where
show (Pattern v [] ) = v `with` "" ++ ";"
show (Pattern v props) = v `with` " " ++ showProps props ++ ";"
instance IsPattern Pattern where
toPattern = id
instance IsPattern Var where
toPattern = toPattern . toVarOrName
instance IsPattern Name where
toPattern = toPattern . toVarOrName
instance IsPattern VarOrName where
toPattern v = Pattern (Just v) []