{-# LANGUAGE AllowAmbiguousTypes     #-}
{-# LANGUAGE ConstrainedClassMethods #-}
{-# LANGUAGE FlexibleContexts        #-}
{-# LANGUAGE OverloadedStrings       #-}
{-# LANGUAGE QuasiQuotes             #-}
{-# LANGUAGE ScopedTypeVariables     #-}
{-# LANGUAGE TypeApplications        #-}
{-# LANGUAGE TypeFamilies            #-}
{-# LANGUAGE TypeFamilyDependencies  #-}
module Database.Bolt.Extras.Graph.Internal.GraphQuery
  (
    GraphQuery (..)
  , GetRequest (..)
  , PutRequest (..)
  , mergeGraphs
  ) where
import           Control.Lens                                      (over, (^.))
import           Control.Monad.IO.Class                            (MonadIO)
import           Data.List                                         (foldl')
import           Data.Map.Strict                                   (fromList,
                                                                    mapKeys,
                                                                    mapWithKey,
                                                                    toList,
                                                                    union, (!))
import           Data.Text                                         as T (Text, intercalate,
                                                                         null,
                                                                         pack)
import           Database.Bolt                                     (BoltActionT,
                                                                    Record,
                                                                    query)
import           Database.Bolt.Extras                              (BoltId, GetBoltId (..))
import           Database.Bolt.Extras.Graph.Internal.AbstractGraph (Graph (..),
                                                                    NodeName,
                                                                    emptyGraph,
                                                                    relationName,
                                                                    relations,
                                                                    vertices)
import           Database.Bolt.Extras.Graph.Internal.Class         (Extractable (..),
                                                                    Requestable (..),
                                                                    Returnable (..))
import           Database.Bolt.Extras.Graph.Internal.Get           (NodeGetter,
                                                                    NodeResult,
                                                                    RelGetter,
                                                                    RelResult,
                                                                    requestGetters)
import           Database.Bolt.Extras.Graph.Internal.Put           (PutNode, PutRelationship,
                                                                    requestPut)
import           NeatInterpolation                                 (text)
class GraphQuery a where
  
  type NodeReq a :: *
  
  type RelReq  a :: *
  
  type NodeRes a :: *
  
  type RelRes  a :: *
  
  requestEntities :: (Requestable (NodeName, NodeReq a),
                      Requestable ((NodeName, NodeName), RelReq a))
                  => [(NodeName, NodeReq a)]
                  -> [((NodeName, NodeName), RelReq a)]
                  -> (Text, [Text])
  
  
  formQuery :: (Requestable (NodeName, NodeReq a),
                Requestable ((NodeName, NodeName), RelReq a),
                Returnable (NodeName, NodeReq a),
                Returnable ((NodeName, NodeName), RelReq a))
            => [Text]                                
            -> Graph NodeName (NodeReq a) (RelReq a) 
            -> Text                                  
  formQuery [Text]
customConds Graph Text (NodeReq a) (RelReq a)
graph = [text|$completeRequest
                                      $conditionsQ
                                      WITH DISTINCT $distinctVars
                                      RETURN $completeReturn|]
    where
      vertices' :: [(Text, NodeReq a)]
vertices'        = Map Text (NodeReq a) -> [(Text, NodeReq a)]
forall k a. Map k a -> [(k, a)]
toList (Graph Text (NodeReq a) (RelReq a)
graph Graph Text (NodeReq a) (RelReq a)
-> Getting
     (Map Text (NodeReq a))
     (Graph Text (NodeReq a) (RelReq a))
     (Map Text (NodeReq a))
-> Map Text (NodeReq a)
forall s a. s -> Getting a s a -> a
^. Getting
  (Map Text (NodeReq a))
  (Graph Text (NodeReq a) (RelReq a))
  (Map Text (NodeReq a))
forall n a b a2.
Lens (Graph n a b) (Graph n a2 b) (Map n a) (Map n a2)
vertices)
      relations' :: [((Text, Text), RelReq a)]
relations'       = Map (Text, Text) (RelReq a) -> [((Text, Text), RelReq a)]
forall k a. Map k a -> [(k, a)]
toList (Graph Text (NodeReq a) (RelReq a)
graph Graph Text (NodeReq a) (RelReq a)
-> Getting
     (Map (Text, Text) (RelReq a))
     (Graph Text (NodeReq a) (RelReq a))
     (Map (Text, Text) (RelReq a))
-> Map (Text, Text) (RelReq a)
forall s a. s -> Getting a s a -> a
^. Getting
  (Map (Text, Text) (RelReq a))
  (Graph Text (NodeReq a) (RelReq a))
  (Map (Text, Text) (RelReq a))
forall n a b b2.
Lens (Graph n a b) (Graph n a b2) (Map (n, n) b) (Map (n, n) b2)
relations)
      distinctVars :: Text
distinctVars     = Text -> [Text] -> Text
intercalate Text
", " ([Text] -> Text) -> [Text] -> Text
forall a b. (a -> b) -> a -> b
$ ((Text, NodeReq a) -> Text) -> [(Text, NodeReq a)] -> [Text]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Text, NodeReq a) -> Text
forall a b. (a, b) -> a
fst [(Text, NodeReq a)]
vertices' [Text] -> [Text] -> [Text]
forall a. [a] -> [a] -> [a]
++ (((Text, Text), RelReq a) -> Text)
-> [((Text, Text), RelReq a)] -> [Text]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((Text, Text) -> Text
relationName ((Text, Text) -> Text)
-> (((Text, Text), RelReq a) -> (Text, Text))
-> ((Text, Text), RelReq a)
-> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((Text, Text), RelReq a) -> (Text, Text)
forall a b. (a, b) -> a
fst) [((Text, Text), RelReq a)]
relations'
      (Text
completeRequest, [Text]
reqConds) = [(Text, NodeReq a)] -> [((Text, Text), RelReq a)] -> (Text, [Text])
forall a.
(GraphQuery a, Requestable (Text, NodeReq a),
 Requestable ((Text, Text), RelReq a)) =>
[(Text, NodeReq a)] -> [((Text, Text), RelReq a)] -> (Text, [Text])
requestEntities @a [(Text, NodeReq a)]
vertices' [((Text, Text), RelReq a)]
relations'
      conditions :: [Text]
conditions       = [Text]
reqConds [Text] -> [Text] -> [Text]
forall a. [a] -> [a] -> [a]
++ [Text]
customConds
      conditionsQ :: Text
conditionsQ      = if [Text] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
Prelude.null [Text]
conditions then Text
"" else Text
" WHERE " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text -> [Text] -> Text
intercalate Text
" AND " [Text]
conditions
      returnVertices :: [Text]
returnVertices   = (Text, NodeReq a) -> Text
forall a. Returnable a => a -> Text
return' ((Text, NodeReq a) -> Text) -> [(Text, NodeReq a)] -> [Text]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ((Text, NodeReq a) -> Bool)
-> [(Text, NodeReq a)] -> [(Text, NodeReq a)]
forall a. (a -> Bool) -> [a] -> [a]
filter (Text, NodeReq a) -> Bool
forall a. Returnable a => a -> Bool
isReturned' [(Text, NodeReq a)]
vertices'
      returnRelations :: [Text]
returnRelations  = ((Text, Text), RelReq a) -> Text
forall a. Returnable a => a -> Text
return' (((Text, Text), RelReq a) -> Text)
-> [((Text, Text), RelReq a)] -> [Text]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (((Text, Text), RelReq a) -> Bool)
-> [((Text, Text), RelReq a)] -> [((Text, Text), RelReq a)]
forall a. (a -> Bool) -> [a] -> [a]
filter ((Text, Text), RelReq a) -> Bool
forall a. Returnable a => a -> Bool
isReturned' [((Text, Text), RelReq a)]
relations'
      completeReturn :: Text
completeReturn   = Text -> [Text] -> Text
intercalate Text
", " ([Text] -> Text) -> [Text] -> Text
forall a b. (a -> b) -> a -> b
$ (Text -> Bool) -> [Text] -> [Text]
forall a. (a -> Bool) -> [a] -> [a]
Prelude.filter (Bool -> Bool
not (Bool -> Bool) -> (Text -> Bool) -> Text -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Bool
T.null) ([Text] -> [Text]) -> [Text] -> [Text]
forall a b. (a -> b) -> a -> b
$ [Text]
returnVertices [Text] -> [Text] -> [Text]
forall a. [a] -> [a] -> [a]
++ [Text]
returnRelations
  
  
   :: (Extractable (NodeRes a), Extractable (RelRes a), MonadIO m)
                => [NodeName]
                -> [(NodeName, NodeName)]
                -> [Record]
                -> BoltActionT m [Graph NodeName (NodeRes a) (RelRes a)]
  extractGraphs [Text]
verticesN [(Text, Text)]
relationsN [Record]
records = (Int -> BoltActionT m (Graph Text (NodeRes a) (RelRes a)))
-> [Int] -> BoltActionT m [Graph Text (NodeRes a) (RelRes a)]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (\Int
i -> do
        [(Text, NodeRes a)]
vertices'  <- [Text] -> [NodeRes a] -> [(Text, NodeRes a)]
forall a b. [a] -> [b] -> [(a, b)]
zip [Text]
verticesN  ([NodeRes a] -> [(Text, NodeRes a)])
-> BoltActionT m [NodeRes a] -> BoltActionT m [(Text, NodeRes a)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Text -> BoltActionT m (NodeRes a))
-> [Text] -> BoltActionT m [NodeRes a]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse (([NodeRes a] -> NodeRes a)
-> BoltActionT m [NodeRes a] -> BoltActionT m (NodeRes a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ([NodeRes a] -> Int -> NodeRes a
forall a. [a] -> Int -> a
!! Int
i) (BoltActionT m [NodeRes a] -> BoltActionT m (NodeRes a))
-> (Text -> BoltActionT m [NodeRes a])
-> Text
-> BoltActionT m (NodeRes a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Text -> [Record] -> BoltActionT m [NodeRes a])
-> [Record] -> Text -> BoltActionT m [NodeRes a]
forall a b c. (a -> b -> c) -> b -> a -> c
flip Text -> [Record] -> BoltActionT m [NodeRes a]
forall a (m :: * -> *).
(Extractable a, MonadIO m) =>
Text -> [Record] -> BoltActionT m [a]
extract [Record]
records               ) [Text]
verticesN
        [((Text, Text), RelRes a)]
relations' <- [(Text, Text)] -> [RelRes a] -> [((Text, Text), RelRes a)]
forall a b. [a] -> [b] -> [(a, b)]
zip [(Text, Text)]
relationsN ([RelRes a] -> [((Text, Text), RelRes a)])
-> BoltActionT m [RelRes a]
-> BoltActionT m [((Text, Text), RelRes a)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ((Text, Text) -> BoltActionT m (RelRes a))
-> [(Text, Text)] -> BoltActionT m [RelRes a]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse (([RelRes a] -> RelRes a)
-> BoltActionT m [RelRes a] -> BoltActionT m (RelRes a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ([RelRes a] -> Int -> RelRes a
forall a. [a] -> Int -> a
!! Int
i) (BoltActionT m [RelRes a] -> BoltActionT m (RelRes a))
-> ((Text, Text) -> BoltActionT m [RelRes a])
-> (Text, Text)
-> BoltActionT m (RelRes a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Text -> [Record] -> BoltActionT m [RelRes a])
-> [Record] -> Text -> BoltActionT m [RelRes a]
forall a b c. (a -> b -> c) -> b -> a -> c
flip Text -> [Record] -> BoltActionT m [RelRes a]
forall a (m :: * -> *).
(Extractable a, MonadIO m) =>
Text -> [Record] -> BoltActionT m [a]
extract [Record]
records (Text -> BoltActionT m [RelRes a])
-> ((Text, Text) -> Text)
-> (Text, Text)
-> BoltActionT m [RelRes a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Text, Text) -> Text
relationName) [(Text, Text)]
relationsN
        Graph Text (NodeRes a) (RelRes a)
-> BoltActionT m (Graph Text (NodeRes a) (RelRes a))
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Graph Text (NodeRes a) (RelRes a)
 -> BoltActionT m (Graph Text (NodeRes a) (RelRes a)))
-> Graph Text (NodeRes a) (RelRes a)
-> BoltActionT m (Graph Text (NodeRes a) (RelRes a))
forall a b. (a -> b) -> a -> b
$ Map Text (NodeRes a)
-> Map (Text, Text) (RelRes a) -> Graph Text (NodeRes a) (RelRes a)
forall n a b. Map n a -> Map (n, n) b -> Graph n a b
Graph ([(Text, NodeRes a)] -> Map Text (NodeRes a)
forall k a. Ord k => [(k, a)] -> Map k a
fromList [(Text, NodeRes a)]
vertices') ([((Text, Text), RelRes a)] -> Map (Text, Text) (RelRes a)
forall k a. Ord k => [(k, a)] -> Map k a
fromList [((Text, Text), RelRes a)]
relations'))
      [Int
0 .. [Record] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Record]
records Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1]
  
  
  makeRequest :: (Requestable (NodeName, NodeReq a),
                  Requestable ((NodeName, NodeName), RelReq a),
                  Returnable (NodeName, NodeReq a),
                  Returnable ((NodeName, NodeName), RelReq a),
                  Extractable (NodeRes a),
                  Extractable (RelRes a),
                  MonadIO m)
              => [Text]
              -> Graph NodeName (NodeReq a) (RelReq a)
              -> BoltActionT m [Graph NodeName (NodeRes a) (RelRes a)]
  makeRequest [Text]
conds Graph Text (NodeReq a) (RelReq a)
graph = do
      [Record]
response <- Text -> BoltActionT m [Record]
forall (m :: * -> *). MonadIO m => Text -> BoltActionT m [Record]
query (Text -> BoltActionT m [Record]) -> Text -> BoltActionT m [Record]
forall a b. (a -> b) -> a -> b
$ [Text] -> Graph Text (NodeReq a) (RelReq a) -> Text
forall a.
(GraphQuery a, Requestable (Text, NodeReq a),
 Requestable ((Text, Text), RelReq a), Returnable (Text, NodeReq a),
 Returnable ((Text, Text), RelReq a)) =>
[Text] -> Graph Text (NodeReq a) (RelReq a) -> Text
formQuery @a [Text]
conds Graph Text (NodeReq a) (RelReq a)
graph
      [Text]
-> [(Text, Text)]
-> [Record]
-> BoltActionT m [Graph Text (NodeRes a) (RelRes a)]
forall a (m :: * -> *).
(GraphQuery a, Extractable (NodeRes a), Extractable (RelRes a),
 MonadIO m) =>
[Text]
-> [(Text, Text)]
-> [Record]
-> BoltActionT m [Graph Text (NodeRes a) (RelRes a)]
extractGraphs @a [Text]
presentedVertices [(Text, Text)]
presentedRelations [Record]
response
    where
      presentedVertices :: [Text]
presentedVertices  = ((Text, NodeReq a) -> Text) -> [(Text, NodeReq a)] -> [Text]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Text, NodeReq a) -> Text
forall a b. (a, b) -> a
fst ([(Text, NodeReq a)] -> [Text])
-> (Map Text (NodeReq a) -> [(Text, NodeReq a)])
-> Map Text (NodeReq a)
-> [Text]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((Text, NodeReq a) -> Bool)
-> [(Text, NodeReq a)] -> [(Text, NodeReq a)]
forall a. (a -> Bool) -> [a] -> [a]
filter (Text, NodeReq a) -> Bool
forall a. Returnable a => a -> Bool
isReturned' ([(Text, NodeReq a)] -> [(Text, NodeReq a)])
-> (Map Text (NodeReq a) -> [(Text, NodeReq a)])
-> Map Text (NodeReq a)
-> [(Text, NodeReq a)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Map Text (NodeReq a) -> [(Text, NodeReq a)]
forall k a. Map k a -> [(k, a)]
toList (Map Text (NodeReq a) -> [Text]) -> Map Text (NodeReq a) -> [Text]
forall a b. (a -> b) -> a -> b
$ Graph Text (NodeReq a) (RelReq a)
graph Graph Text (NodeReq a) (RelReq a)
-> Getting
     (Map Text (NodeReq a))
     (Graph Text (NodeReq a) (RelReq a))
     (Map Text (NodeReq a))
-> Map Text (NodeReq a)
forall s a. s -> Getting a s a -> a
^. Getting
  (Map Text (NodeReq a))
  (Graph Text (NodeReq a) (RelReq a))
  (Map Text (NodeReq a))
forall n a b a2.
Lens (Graph n a b) (Graph n a2 b) (Map n a) (Map n a2)
vertices
      presentedRelations :: [(Text, Text)]
presentedRelations = (((Text, Text), RelReq a) -> (Text, Text))
-> [((Text, Text), RelReq a)] -> [(Text, Text)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((Text, Text), RelReq a) -> (Text, Text)
forall a b. (a, b) -> a
fst ([((Text, Text), RelReq a)] -> [(Text, Text)])
-> (Map (Text, Text) (RelReq a) -> [((Text, Text), RelReq a)])
-> Map (Text, Text) (RelReq a)
-> [(Text, Text)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (((Text, Text), RelReq a) -> Bool)
-> [((Text, Text), RelReq a)] -> [((Text, Text), RelReq a)]
forall a. (a -> Bool) -> [a] -> [a]
filter ((Text, Text), RelReq a) -> Bool
forall a. Returnable a => a -> Bool
isReturned' ([((Text, Text), RelReq a)] -> [((Text, Text), RelReq a)])
-> (Map (Text, Text) (RelReq a) -> [((Text, Text), RelReq a)])
-> Map (Text, Text) (RelReq a)
-> [((Text, Text), RelReq a)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Map (Text, Text) (RelReq a) -> [((Text, Text), RelReq a)]
forall k a. Map k a -> [(k, a)]
toList (Map (Text, Text) (RelReq a) -> [(Text, Text)])
-> Map (Text, Text) (RelReq a) -> [(Text, Text)]
forall a b. (a -> b) -> a -> b
$ Graph Text (NodeReq a) (RelReq a)
graph Graph Text (NodeReq a) (RelReq a)
-> Getting
     (Map (Text, Text) (RelReq a))
     (Graph Text (NodeReq a) (RelReq a))
     (Map (Text, Text) (RelReq a))
-> Map (Text, Text) (RelReq a)
forall s a. s -> Getting a s a -> a
^. Getting
  (Map (Text, Text) (RelReq a))
  (Graph Text (NodeReq a) (RelReq a))
  (Map (Text, Text) (RelReq a))
forall n a b b2.
Lens (Graph n a b) (Graph n a b2) (Map (n, n) b) (Map (n, n) b2)
relations
data GetRequest = GetRequest
instance GraphQuery GetRequest where
  type NodeReq GetRequest = NodeGetter
  type RelReq  GetRequest = RelGetter
  type NodeRes GetRequest = NodeResult
  type RelRes  GetRequest = RelResult
  requestEntities :: [(Text, NodeReq GetRequest)]
-> [((Text, Text), RelReq GetRequest)] -> (Text, [Text])
requestEntities         = [(Text, NodeGetter)]
-> [((Text, Text), RelGetter)] -> (Text, [Text])
[(Text, NodeReq GetRequest)]
-> [((Text, Text), RelReq GetRequest)] -> (Text, [Text])
requestGetters
data PutRequest = PutRequest
instance GraphQuery PutRequest where
  type NodeReq PutRequest = PutNode
  type RelReq  PutRequest = PutRelationship
  type NodeRes PutRequest = BoltId
  type RelRes  PutRequest = BoltId
  requestEntities :: [(Text, NodeReq PutRequest)]
-> [((Text, Text), RelReq PutRequest)] -> (Text, [Text])
requestEntities          = [(Text, PutNode)]
-> [((Text, Text), PutRelationship)] -> (Text, [Text])
[(Text, NodeReq PutRequest)]
-> [((Text, Text), RelReq PutRequest)] -> (Text, [Text])
requestPut
mergeGraphs :: GetBoltId a => [Graph NodeName a b] -> Graph NodeName a b
mergeGraphs :: [Graph Text a b] -> Graph Text a b
mergeGraphs [Graph Text a b]
graphs = (Graph Text a b -> Graph Text a b -> Graph Text a b)
-> Graph Text a b -> [Graph Text a b] -> Graph Text a b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' Graph Text a b -> Graph Text a b -> Graph Text a b
forall a b.
GetBoltId a =>
Graph Text a b -> Graph Text a b -> Graph Text a b
mergeGraph Graph Text a b
forall n a b. Ord n => Graph n a b
emptyGraph (Graph Text a b -> Graph Text a b
forall a b. GetBoltId a => Graph Text a b -> Graph Text a b
updateGraph (Graph Text a b -> Graph Text a b)
-> [Graph Text a b] -> [Graph Text a b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Graph Text a b]
graphs)
  where
    updateGraph :: GetBoltId a => Graph NodeName a b -> Graph NodeName a b
    updateGraph :: Graph Text a b -> Graph Text a b
updateGraph Graph Text a b
graph = Map Text a -> Map (Text, Text) b -> Graph Text a b
forall n a b. Map n a -> Map (n, n) b -> Graph n a b
Graph Map Text a
newVertices Map (Text, Text) b
newRelations
      where
        namesMap :: Map Text Text
namesMap     = (\Text
name        a
node     ->  Text
name Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> (String -> Text
pack (String -> Text) -> (a -> String) -> a -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> String
forall a. Show a => a -> String
show (Int -> String) -> (a -> Int) -> a -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Int
forall a. GetBoltId a => a -> Int
getBoltId (a -> Text) -> a -> Text
forall a b. (a -> b) -> a -> b
$ a
node)  ) (Text -> a -> Text) -> Map Text a -> Map Text Text
forall k a b. (k -> a -> b) -> Map k a -> Map k b
`mapWithKey` (Graph Text a b
graph Graph Text a b
-> Getting (Map Text a) (Graph Text a b) (Map Text a) -> Map Text a
forall s a. s -> Getting a s a -> a
^. Getting (Map Text a) (Graph Text a b) (Map Text a)
forall n a b a2.
Lens (Graph n a b) (Graph n a2 b) (Map n a) (Map n a2)
vertices)
        newVertices :: Map Text a
newVertices  = (\Text
name                 ->  Map Text Text
namesMap Map Text Text -> Text -> Text
forall k a. Ord k => Map k a -> k -> a
! Text
name                           ) (Text -> Text) -> Map Text a -> Map Text a
forall k2 k1 a. Ord k2 => (k1 -> k2) -> Map k1 a -> Map k2 a
`mapKeys`    (Graph Text a b
graph Graph Text a b
-> Getting (Map Text a) (Graph Text a b) (Map Text a) -> Map Text a
forall s a. s -> Getting a s a -> a
^. Getting (Map Text a) (Graph Text a b) (Map Text a)
forall n a b a2.
Lens (Graph n a b) (Graph n a2 b) (Map n a) (Map n a2)
vertices)
        newRelations :: Map (Text, Text) b
newRelations = (\(Text
startName, Text
endName) -> (Map Text Text
namesMap Map Text Text -> Text -> Text
forall k a. Ord k => Map k a -> k -> a
! Text
startName, Map Text Text
namesMap Map Text Text -> Text -> Text
forall k a. Ord k => Map k a -> k -> a
! Text
endName) ) ((Text, Text) -> (Text, Text))
-> Map (Text, Text) b -> Map (Text, Text) b
forall k2 k1 a. Ord k2 => (k1 -> k2) -> Map k1 a -> Map k2 a
`mapKeys`    (Graph Text a b
graph Graph Text a b
-> Getting
     (Map (Text, Text) b) (Graph Text a b) (Map (Text, Text) b)
-> Map (Text, Text) b
forall s a. s -> Getting a s a -> a
^. Getting (Map (Text, Text) b) (Graph Text a b) (Map (Text, Text) b)
forall n a b b2.
Lens (Graph n a b) (Graph n a b2) (Map (n, n) b) (Map (n, n) b2)
relations)
    mergeGraph :: GetBoltId a => Graph NodeName a b -> Graph NodeName a b -> Graph NodeName a b
    mergeGraph :: Graph Text a b -> Graph Text a b -> Graph Text a b
mergeGraph Graph Text a b
graphToMerge Graph Text a b
initialGraph = ASetter
  (Graph Text a b)
  (Graph Text a b)
  (Map (Text, Text) b)
  (Map (Text, Text) b)
-> (Map (Text, Text) b -> Map (Text, Text) b)
-> Graph Text a b
-> Graph Text a b
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
over ASetter
  (Graph Text a b)
  (Graph Text a b)
  (Map (Text, Text) b)
  (Map (Text, Text) b)
forall n a b b2.
Lens (Graph n a b) (Graph n a b2) (Map (n, n) b) (Map (n, n) b2)
relations (Map (Text, Text) b -> Map (Text, Text) b -> Map (Text, Text) b
forall k a. Ord k => Map k a -> Map k a -> Map k a
union (Graph Text a b
graphToMerge Graph Text a b
-> Getting
     (Map (Text, Text) b) (Graph Text a b) (Map (Text, Text) b)
-> Map (Text, Text) b
forall s a. s -> Getting a s a -> a
^. Getting (Map (Text, Text) b) (Graph Text a b) (Map (Text, Text) b)
forall n a b b2.
Lens (Graph n a b) (Graph n a b2) (Map (n, n) b) (Map (n, n) b2)
relations)) (Graph Text a b -> Graph Text a b)
-> Graph Text a b -> Graph Text a b
forall a b. (a -> b) -> a -> b
$
                                           ASetter (Graph Text a b) (Graph Text a b) (Map Text a) (Map Text a)
-> (Map Text a -> Map Text a) -> Graph Text a b -> Graph Text a b
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
over ASetter (Graph Text a b) (Graph Text a b) (Map Text a) (Map Text a)
forall n a b a2.
Lens (Graph n a b) (Graph n a2 b) (Map n a) (Map n a2)
vertices  (Map Text a -> Map Text a -> Map Text a
forall k a. Ord k => Map k a -> Map k a -> Map k a
union (Graph Text a b
graphToMerge Graph Text a b
-> Getting (Map Text a) (Graph Text a b) (Map Text a) -> Map Text a
forall s a. s -> Getting a s a -> a
^. Getting (Map Text a) (Graph Text a b) (Map Text a)
forall n a b a2.
Lens (Graph n a b) (Graph n a2 b) (Map n a) (Map n a2)
vertices))
                                           Graph Text a b
initialGraph