{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeFamilies #-}
module Data.Greskell.Gremlin
(
Predicate (..)
, PredicateA (..)
, P
, PLike (..)
, pNot
, pEq
, pNeq
, pLt
, pLte
, pGt
, pGte
, pInside
, pOutside
, pBetween
, pWithin
, pWithout
, Comparator (..)
, ComparatorA (..)
, Order
, oDesc
, oAsc
, oDecr
, oIncr
, oShuffle
, examples
) where
import Data.Aeson (Value)
import Data.Greskell.GraphSON (GraphSONTyped (..))
import Data.Greskell.Greskell (Greskell, ToGreskell, string, toGremlin, toGremlinLazy,
unsafeFunCall, unsafeGreskellLazy, unsafeMethodCall)
import Data.Monoid ((<>))
import Data.Text (Text)
class Predicate p where
type PredicateArg p
pAnd :: Greskell p -> Greskell p -> Greskell p
pAnd Greskell p
p1 Greskell p
p2 = Greskell p -> Text -> [Text] -> Greskell p
forall a b. Greskell a -> Text -> [Text] -> Greskell b
unsafeMethodCall Greskell p
p1 Text
"and" [Greskell p -> Text
forall a. ToGreskell a => a -> Text
toGremlin Greskell p
p2]
pOr :: Greskell p -> Greskell p -> Greskell p
pOr Greskell p
o1 Greskell p
o2 = Greskell p -> Text -> [Text] -> Greskell p
forall a b. Greskell a -> Text -> [Text] -> Greskell b
unsafeMethodCall Greskell p
o1 Text
"or" [Greskell p -> Text
forall a. ToGreskell a => a -> Text
toGremlin Greskell p
o2]
pTest :: Greskell p -> Greskell (PredicateArg p) -> Greskell Bool
pTest Greskell p
p Greskell (PredicateArg p)
arg = Greskell p -> Text -> [Text] -> Greskell Bool
forall a b. Greskell a -> Text -> [Text] -> Greskell b
unsafeMethodCall Greskell p
p Text
"test" [Greskell (PredicateArg p) -> Text
forall a. ToGreskell a => a -> Text
toGremlin Greskell (PredicateArg p)
arg]
pNegate :: Greskell p -> Greskell p
pNegate Greskell p
p = Greskell p -> Text -> [Text] -> Greskell p
forall a b. Greskell a -> Text -> [Text] -> Greskell b
unsafeMethodCall Greskell p
p Text
"negate" []
newtype PredicateA a
= PredicateA { forall a. PredicateA a -> a -> Bool
unPredicateA :: a -> Bool }
instance Predicate (PredicateA a) where
type PredicateArg (PredicateA a) = a
data P a
instance Predicate (P a) where
type PredicateArg (P a) = a
instance GraphSONTyped (P a) where
gsonTypeFor :: P a -> Text
gsonTypeFor P a
_ = Text
"g:P"
class (ToGreskell (PParameter p)) => PLike p where
type PParameter p
instance PLike (P a) where
type PParameter (P a) = Greskell a
pNot :: PLike p => Greskell p -> Greskell p
pNot :: forall p. PLike p => Greskell p -> Greskell p
pNot Greskell p
a = Text -> [Text] -> Greskell p
forall a. Text -> [Text] -> Greskell a
unsafeFunCall Text
"P.not" [Greskell p -> Text
forall a. ToGreskell a => a -> Text
toGremlin Greskell p
a]
pEq :: PLike p => PParameter p -> Greskell p
pEq :: forall p. PLike p => PParameter p -> Greskell p
pEq PParameter p
arg = Text -> [Text] -> Greskell p
forall a. Text -> [Text] -> Greskell a
unsafeFunCall Text
"P.eq" [PParameter p -> Text
forall a. ToGreskell a => a -> Text
toGremlin PParameter p
arg]
pNeq :: PLike p => PParameter p -> Greskell p
pNeq :: forall p. PLike p => PParameter p -> Greskell p
pNeq PParameter p
arg = Text -> [Text] -> Greskell p
forall a. Text -> [Text] -> Greskell a
unsafeFunCall Text
"P.neq" [PParameter p -> Text
forall a. ToGreskell a => a -> Text
toGremlin PParameter p
arg]
pLt :: PLike p => PParameter p -> Greskell p
pLt :: forall p. PLike p => PParameter p -> Greskell p
pLt PParameter p
arg = Text -> [Text] -> Greskell p
forall a. Text -> [Text] -> Greskell a
unsafeFunCall Text
"P.lt" [PParameter p -> Text
forall a. ToGreskell a => a -> Text
toGremlin PParameter p
arg]
pLte :: PLike p => PParameter p -> Greskell p
pLte :: forall p. PLike p => PParameter p -> Greskell p
pLte PParameter p
arg = Text -> [Text] -> Greskell p
forall a. Text -> [Text] -> Greskell a
unsafeFunCall Text
"P.lte" [PParameter p -> Text
forall a. ToGreskell a => a -> Text
toGremlin PParameter p
arg]
pGt :: PLike p => PParameter p -> Greskell p
pGt :: forall p. PLike p => PParameter p -> Greskell p
pGt PParameter p
arg = Text -> [Text] -> Greskell p
forall a. Text -> [Text] -> Greskell a
unsafeFunCall Text
"P.gt" [PParameter p -> Text
forall a. ToGreskell a => a -> Text
toGremlin PParameter p
arg]
pGte :: PLike p => PParameter p -> Greskell p
pGte :: forall p. PLike p => PParameter p -> Greskell p
pGte PParameter p
arg = Text -> [Text] -> Greskell p
forall a. Text -> [Text] -> Greskell a
unsafeFunCall Text
"P.gte" [PParameter p -> Text
forall a. ToGreskell a => a -> Text
toGremlin PParameter p
arg]
pInside :: PLike p => PParameter p -> PParameter p -> Greskell p
pInside :: forall p. PLike p => PParameter p -> PParameter p -> Greskell p
pInside PParameter p
a PParameter p
b = Text -> [Text] -> Greskell p
forall a. Text -> [Text] -> Greskell a
unsafeFunCall Text
"P.inside" ([Text] -> Greskell p) -> [Text] -> Greskell p
forall a b. (a -> b) -> a -> b
$ (PParameter p -> Text) -> [PParameter p] -> [Text]
forall a b. (a -> b) -> [a] -> [b]
map PParameter p -> Text
forall a. ToGreskell a => a -> Text
toGremlin [PParameter p
a, PParameter p
b]
pOutside :: PLike p => PParameter p -> PParameter p -> Greskell p
pOutside :: forall p. PLike p => PParameter p -> PParameter p -> Greskell p
pOutside PParameter p
a PParameter p
b = Text -> [Text] -> Greskell p
forall a. Text -> [Text] -> Greskell a
unsafeFunCall Text
"P.outside" ([Text] -> Greskell p) -> [Text] -> Greskell p
forall a b. (a -> b) -> a -> b
$ (PParameter p -> Text) -> [PParameter p] -> [Text]
forall a b. (a -> b) -> [a] -> [b]
map PParameter p -> Text
forall a. ToGreskell a => a -> Text
toGremlin [PParameter p
a, PParameter p
b]
pBetween :: PLike p => PParameter p -> PParameter p -> Greskell p
pBetween :: forall p. PLike p => PParameter p -> PParameter p -> Greskell p
pBetween PParameter p
a PParameter p
b = Text -> [Text] -> Greskell p
forall a. Text -> [Text] -> Greskell a
unsafeFunCall Text
"P.between" ([Text] -> Greskell p) -> [Text] -> Greskell p
forall a b. (a -> b) -> a -> b
$ (PParameter p -> Text) -> [PParameter p] -> [Text]
forall a b. (a -> b) -> [a] -> [b]
map PParameter p -> Text
forall a. ToGreskell a => a -> Text
toGremlin [PParameter p
a, PParameter p
b]
pWithin :: PLike p => [PParameter p] -> Greskell p
pWithin :: forall p. PLike p => [PParameter p] -> Greskell p
pWithin = Text -> [Text] -> Greskell p
forall a. Text -> [Text] -> Greskell a
unsafeFunCall Text
"P.within" ([Text] -> Greskell p)
-> ([PParameter p] -> [Text]) -> [PParameter p] -> Greskell p
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (PParameter p -> Text) -> [PParameter p] -> [Text]
forall a b. (a -> b) -> [a] -> [b]
map PParameter p -> Text
forall a. ToGreskell a => a -> Text
toGremlin
pWithout :: PLike p => [PParameter p] -> Greskell p
pWithout :: forall p. PLike p => [PParameter p] -> Greskell p
pWithout = Text -> [Text] -> Greskell p
forall a. Text -> [Text] -> Greskell a
unsafeFunCall Text
"P.without" ([Text] -> Greskell p)
-> ([PParameter p] -> [Text]) -> [PParameter p] -> Greskell p
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (PParameter p -> Text) -> [PParameter p] -> [Text]
forall a b. (a -> b) -> [a] -> [b]
map PParameter p -> Text
forall a. ToGreskell a => a -> Text
toGremlin
class Comparator c where
type CompareArg c
cCompare :: Greskell c -> Greskell (CompareArg c) -> Greskell (CompareArg c) -> Greskell Int
cCompare Greskell c
cmp Greskell (CompareArg c)
a Greskell (CompareArg c)
b = Greskell c -> Text -> [Text] -> Greskell Int
forall a b. Greskell a -> Text -> [Text] -> Greskell b
unsafeMethodCall Greskell c
cmp Text
"compare" ([Text] -> Greskell Int) -> [Text] -> Greskell Int
forall a b. (a -> b) -> a -> b
$ (Greskell (CompareArg c) -> Text)
-> [Greskell (CompareArg c)] -> [Text]
forall a b. (a -> b) -> [a] -> [b]
map Greskell (CompareArg c) -> Text
forall a. ToGreskell a => a -> Text
toGremlin [Greskell (CompareArg c)
a, Greskell (CompareArg c)
b]
cReversed :: Greskell c -> Greskell c
cReversed Greskell c
cmp = Greskell c -> Text -> [Text] -> Greskell c
forall a b. Greskell a -> Text -> [Text] -> Greskell b
unsafeMethodCall Greskell c
cmp Text
"reversed" []
cThenComparing :: Greskell c -> Greskell c -> Greskell c
cThenComparing Greskell c
cmp1 Greskell c
cmp2 = Greskell c -> Text -> [Text] -> Greskell c
forall a b. Greskell a -> Text -> [Text] -> Greskell b
unsafeMethodCall Greskell c
cmp1 Text
"thenComparing" [Greskell c -> Text
forall a. ToGreskell a => a -> Text
toGremlin Greskell c
cmp2]
newtype ComparatorA a
= ComparatorA { forall a. ComparatorA a -> a -> a -> Int
unComparatorA :: a -> a -> Int }
instance Comparator (ComparatorA a) where
type CompareArg (ComparatorA a) = a
data Order a
instance Comparator (Order a) where
type CompareArg (Order a) = a
instance GraphSONTyped (Order a) where
gsonTypeFor :: Order a -> Text
gsonTypeFor Order a
_ = Text
"g:Order"
oDesc :: Greskell (Order a)
oDesc :: forall a. Greskell (Order a)
oDesc = Text -> Greskell (Order a)
forall a. Text -> Greskell a
unsafeGreskellLazy Text
"Order.desc"
oAsc :: Greskell (Order a)
oAsc :: forall a. Greskell (Order a)
oAsc = Text -> Greskell (Order a)
forall a. Text -> Greskell a
unsafeGreskellLazy Text
"Order.asc"
oDecr :: Greskell (Order a)
oDecr :: forall a. Greskell (Order a)
oDecr = Text -> Greskell (Order a)
forall a. Text -> Greskell a
unsafeGreskellLazy Text
"Order.decr"
oIncr :: Greskell (Order a)
oIncr :: forall a. Greskell (Order a)
oIncr = Text -> Greskell (Order a)
forall a. Text -> Greskell a
unsafeGreskellLazy Text
"Order.incr"
oShuffle :: Greskell (Order a)
oShuffle :: forall a. Greskell (Order a)
oShuffle = Text -> Greskell (Order a)
forall a. Text -> Greskell a
unsafeGreskellLazy Text
"Order.shuffle"
examples :: [(Text, Text)]
examples :: [(Text, Text)]
examples =
[ (Greskell (P Int) -> Text
forall a. ToGreskell a => a -> Text
toGremlin (Greskell (P Int) -> Greskell (P Int)
forall p. PLike p => Greskell p -> Greskell p
pNot (Greskell (P Int) -> Greskell (P Int))
-> Greskell (P Int) -> Greskell (P Int)
forall a b. (a -> b) -> a -> b
$ PParameter (P Int) -> Greskell (P Int)
forall p. PLike p => PParameter p -> Greskell p
pEq (PParameter (P Int) -> Greskell (P Int))
-> PParameter (P Int) -> Greskell (P Int)
forall a b. (a -> b) -> a -> b
$ Greskell Int
PParameter (P Int)
10 :: Greskell (P Int)), Text
"P.not(P.eq(10))")
, (Greskell (P Text) -> Text
forall a. ToGreskell a => a -> Text
toGremlin (PParameter (P Text) -> Greskell (P Text)
forall p. PLike p => PParameter p -> Greskell p
pEq (PParameter (P Text) -> Greskell (P Text))
-> PParameter (P Text) -> Greskell (P Text)
forall a b. (a -> b) -> a -> b
$ Text -> Greskell Text
string Text
"hoge" :: Greskell (P Text)), Text
"P.eq(\"hoge\")")
, (Greskell (P Int) -> Text
forall a. ToGreskell a => a -> Text
toGremlin (PParameter (P Int) -> PParameter (P Int) -> Greskell (P Int)
forall p. PLike p => PParameter p -> PParameter p -> Greskell p
pInside Greskell Int
PParameter (P Int)
10 Greskell Int
PParameter (P Int)
20 :: Greskell (P Int)), Text
"P.inside(10,20)")
, (Greskell (P Text) -> Text
forall a. ToGreskell a => a -> Text
toGremlin ([PParameter (P Text)] -> Greskell (P Text)
forall p. PLike p => [PParameter p] -> Greskell p
pWithin [Greskell Text
PParameter (P Text)
"foo", Greskell Text
PParameter (P Text)
"bar", Greskell Text
PParameter (P Text)
"hoge"] :: Greskell (P Text)), Text
"P.within(\"foo\",\"bar\",\"hoge\")")
, (Greskell (Order Any) -> Text
forall a. ToGreskell a => a -> Text
toGremlin Greskell (Order Any)
forall a. Greskell (Order a)
oDesc, Text
"Order.desc")
, (Greskell (Order Any) -> Text
forall a. ToGreskell a => a -> Text
toGremlin Greskell (Order Any)
forall a. Greskell (Order a)
oAsc, Text
"Order.asc")
, (Greskell (Order Any) -> Text
forall a. ToGreskell a => a -> Text
toGremlin Greskell (Order Any)
forall a. Greskell (Order a)
oDecr, Text
"Order.decr")
, (Greskell (Order Any) -> Text
forall a. ToGreskell a => a -> Text
toGremlin Greskell (Order Any)
forall a. Greskell (Order a)
oIncr, Text
"Order.incr")
]