module Grakn
  ( Match
  , GetQuery
  , Client(Client, keyspace, url)
  , GraknError
  , Result(AnswersResult, AnswerResult, AskResult, CountResult,
       DeleteResult)
  , Options(Options, infer)
  , Var
  , Label
  , Value(ValueString, ValueNumber, ValueBool)
  , defaultUrl
  , defaultKeyspace
  , execute
  , execute_
  , match
  , get
  , limit
  , var
  , label
  , isa
  , (-:)
  , (.:)
  , rp
  , (<:)
  , rel
  , has
  , hasText
  , var_
  ) where

import           Data.Text      (Text)
import           Grakn.Client   (Client (Client, keyspace, url), GraknError,
                                 Options (Options, infer),
                                 Result (AnswerResult, AnswersResult, AskResult, CountResult, DeleteResult),
                                 defaultKeyspace, defaultUrl, execute, execute_)
import           Grakn.Pattern  (Pattern, has, isa, var_, (<:))
import           Grakn.Property (Label, RolePlayer,
                                 Value (ValueBool, ValueNumber, ValueString),
                                 Var, VarOrLabel, label, rp, var, (.:))
import           Grakn.Query    (GetQuery, Match, get, limit, match)
import           Grakn.Util     (Convert)

-- |Specify a property has a particular type
(-:) :: (Convert p Pattern, Convert a VarOrLabel) => p -> a -> Pattern
(-:) = isa

-- |Shorthand to define a relation
rel :: Convert a RolePlayer => [a] -> Pattern
rel = (var_ <:)

-- |Specify a property has a resource
hasText :: (Convert p Pattern) => p -> Label -> Text -> Pattern
hasText = has