{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
module Pattern.Graph.Transform
(
unfoldGraph
, mapGraph
, mapAllGraph
, filterGraph
, foldGraph
, mapWithContext
, scopeDictFromGraphView
, paraGraph
, paraGraphFixed
) where
import Data.List (foldl')
import Data.Map.Strict (Map)
import qualified Data.Map.Strict as Map
import Data.Maybe (mapMaybe)
import qualified Data.Set as Set
import Pattern.Core (Pattern(..), ScopeDict, ScopeQuery(..), toScopeDict)
import Pattern.Graph.Types (GraphView(..))
import Pattern.Graph.GraphClassifier
( GraphClass(..), GraphClassifier(..), GraphValue(..) )
import Pattern.Graph.GraphQuery (GraphQuery(..))
import Pattern.Graph.Types (Substitution(..))
import Pattern.PatternGraph (PatternGraph, mergeWithPolicy, empty)
import qualified Pattern.Reconcile as Reconcile
unfoldGraph
:: ( GraphValue v, Eq v
, Reconcile.Mergeable v, Reconcile.HasIdentity v (Id v), Reconcile.Refinable v )
=> GraphClassifier extra v
-> Reconcile.ReconciliationPolicy (Reconcile.MergeStrategy v)
-> (a -> [Pattern v])
-> [a]
-> PatternGraph extra v
unfoldGraph :: forall v extra a.
(GraphValue v, Eq v, Mergeable v, HasIdentity v (Id v),
Refinable v) =>
GraphClassifier extra v
-> ReconciliationPolicy (MergeStrategy v)
-> (a -> [Pattern v])
-> [a]
-> PatternGraph extra v
unfoldGraph GraphClassifier extra v
classifier ReconciliationPolicy (MergeStrategy v)
policy a -> [Pattern v]
expand [a]
seeds =
(PatternGraph extra v -> a -> PatternGraph extra v)
-> PatternGraph extra v -> [a] -> PatternGraph extra v
forall b a. (b -> a -> b) -> b -> [a] -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' (\PatternGraph extra v
g a
seed -> (PatternGraph extra v -> Pattern v -> PatternGraph extra v)
-> PatternGraph extra v -> [Pattern v] -> PatternGraph extra v
forall b a. (b -> a -> b) -> b -> [a] -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' (\PatternGraph extra v
g' Pattern v
p -> GraphClassifier extra v
-> ReconciliationPolicy (MergeStrategy v)
-> Pattern v
-> PatternGraph extra v
-> PatternGraph extra v
forall v extra.
(GraphValue v, Eq v, Mergeable v, HasIdentity v (Id v),
Refinable v) =>
GraphClassifier extra v
-> ReconciliationPolicy (MergeStrategy v)
-> Pattern v
-> PatternGraph extra v
-> PatternGraph extra v
mergeWithPolicy GraphClassifier extra v
classifier ReconciliationPolicy (MergeStrategy v)
policy Pattern v
p PatternGraph extra v
g') PatternGraph extra v
g (a -> [Pattern v]
expand a
seed))
PatternGraph extra v
forall v extra. GraphValue v => PatternGraph extra v
empty
[a]
seeds
{-# INLINE mapGraph #-}
mapGraph
:: GraphClassifier extra v
-> (Pattern v -> Pattern v)
-> (Pattern v -> Pattern v)
-> (Pattern v -> Pattern v)
-> (Pattern v -> Pattern v)
-> (Pattern v -> Pattern v)
-> GraphView extra v
-> GraphView extra v
mapGraph :: forall extra v.
GraphClassifier extra v
-> (Pattern v -> Pattern v)
-> (Pattern v -> Pattern v)
-> (Pattern v -> Pattern v)
-> (Pattern v -> Pattern v)
-> (Pattern v -> Pattern v)
-> GraphView extra v
-> GraphView extra v
mapGraph GraphClassifier extra v
_classifier Pattern v -> Pattern v
fNode Pattern v -> Pattern v
fRel Pattern v -> Pattern v
fWalk Pattern v -> Pattern v
fAnnot Pattern v -> Pattern v
fOther (GraphView GraphQuery v
q [(GraphClass extra, Pattern v)]
elems) =
GraphQuery v
-> [(GraphClass extra, Pattern v)] -> GraphView extra v
forall extra v.
GraphQuery v
-> [(GraphClass extra, Pattern v)] -> GraphView extra v
GraphView GraphQuery v
q (((GraphClass extra, Pattern v) -> (GraphClass extra, Pattern v))
-> [(GraphClass extra, Pattern v)]
-> [(GraphClass extra, Pattern v)]
forall a b. (a -> b) -> [a] -> [b]
map (GraphClass extra, Pattern v) -> (GraphClass extra, Pattern v)
applyF [(GraphClass extra, Pattern v)]
elems)
where
applyF :: (GraphClass extra, Pattern v) -> (GraphClass extra, Pattern v)
applyF (GraphClass extra
cls, Pattern v
p) = case GraphClass extra
cls of
GraphClass extra
GNode -> (GraphClass extra
cls, Pattern v -> Pattern v
fNode Pattern v
p)
GraphClass extra
GRelationship -> (GraphClass extra
cls, Pattern v -> Pattern v
fRel Pattern v
p)
GraphClass extra
GWalk -> (GraphClass extra
cls, Pattern v -> Pattern v
fWalk Pattern v
p)
GraphClass extra
GAnnotation -> (GraphClass extra
cls, Pattern v -> Pattern v
fAnnot Pattern v
p)
GOther extra
_ -> (GraphClass extra
cls, Pattern v -> Pattern v
fOther Pattern v
p)
mapAllGraph :: (Pattern v -> Pattern v) -> GraphView extra v -> GraphView extra v
mapAllGraph :: forall v extra.
(Pattern v -> Pattern v) -> GraphView extra v -> GraphView extra v
mapAllGraph Pattern v -> Pattern v
f (GraphView GraphQuery v
q [(GraphClass extra, Pattern v)]
elems) = GraphQuery v
-> [(GraphClass extra, Pattern v)] -> GraphView extra v
forall extra v.
GraphQuery v
-> [(GraphClass extra, Pattern v)] -> GraphView extra v
GraphView GraphQuery v
q (((GraphClass extra, Pattern v) -> (GraphClass extra, Pattern v))
-> [(GraphClass extra, Pattern v)]
-> [(GraphClass extra, Pattern v)]
forall a b. (a -> b) -> [a] -> [b]
map (\(GraphClass extra
cls, Pattern v
p) -> (GraphClass extra
cls, Pattern v -> Pattern v
f Pattern v
p)) [(GraphClass extra, Pattern v)]
elems)
filterGraph
:: GraphClassifier extra v
-> (GraphClass extra -> Pattern v -> Bool)
-> Substitution v
-> GraphView extra v
-> GraphView extra v
filterGraph :: forall extra v.
GraphClassifier extra v
-> (GraphClass extra -> Pattern v -> Bool)
-> Substitution v
-> GraphView extra v
-> GraphView extra v
filterGraph GraphClassifier extra v
classifier GraphClass extra -> Pattern v -> Bool
keep Substitution v
subst (GraphView GraphQuery v
q [(GraphClass extra, Pattern v)]
elems) =
GraphQuery v
-> [(GraphClass extra, Pattern v)] -> GraphView extra v
forall extra v.
GraphQuery v
-> [(GraphClass extra, Pattern v)] -> GraphView extra v
GraphView GraphQuery v
q (((GraphClass extra, Pattern v) -> [(GraphClass extra, Pattern v)])
-> [(GraphClass extra, Pattern v)]
-> [(GraphClass extra, Pattern v)]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (GraphClass extra, Pattern v) -> [(GraphClass extra, Pattern v)]
applyFilter [(GraphClass extra, Pattern v)]
elems)
where
applyFilter :: (GraphClass extra, Pattern v) -> [(GraphClass extra, Pattern v)]
applyFilter entry :: (GraphClass extra, Pattern v)
entry@(GraphClass extra
cls, Pattern v
p)
| GraphClass extra -> Pattern v -> Bool
keep GraphClass extra
cls Pattern v
p = case GraphClass extra
cls of
GraphClass extra
GWalk -> case Substitution v
subst of
Substitution v
DeleteContainer ->
let allKept :: Bool
allKept = (Pattern v -> Bool) -> [Pattern v] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (\Pattern v
e -> GraphClass extra -> Pattern v -> Bool
keep (GraphClassifier extra v -> Pattern v -> GraphClass extra
forall extra v.
GraphClassifier extra v -> Pattern v -> GraphClass extra
classify GraphClassifier extra v
classifier Pattern v
e) Pattern v
e) (Pattern v -> [Pattern v]
forall v. Pattern v -> [Pattern v]
elements Pattern v
p)
in if Bool
allKept then [(GraphClass extra, Pattern v)
entry] else []
Substitution v
_ -> [(GraphClass extra
cls, GraphClassifier extra v
-> Substitution v
-> (GraphClass extra -> Pattern v -> Bool)
-> Pattern v
-> Pattern v
forall extra v.
GraphClassifier extra v
-> Substitution v
-> (GraphClass extra -> Pattern v -> Bool)
-> Pattern v
-> Pattern v
repairWalk GraphClassifier extra v
classifier Substitution v
subst GraphClass extra -> Pattern v -> Bool
keep Pattern v
p)]
GraphClass extra
GAnnotation -> case Substitution v
subst of
Substitution v
DeleteContainer ->
let allKept :: Bool
allKept = (Pattern v -> Bool) -> [Pattern v] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (\Pattern v
e -> GraphClass extra -> Pattern v -> Bool
keep (GraphClassifier extra v -> Pattern v -> GraphClass extra
forall extra v.
GraphClassifier extra v -> Pattern v -> GraphClass extra
classify GraphClassifier extra v
classifier Pattern v
e) Pattern v
e) (Pattern v -> [Pattern v]
forall v. Pattern v -> [Pattern v]
elements Pattern v
p)
in if Bool
allKept then [(GraphClass extra, Pattern v)
entry] else []
Substitution v
_ -> [(GraphClass extra
cls, GraphClassifier extra v
-> Substitution v
-> (GraphClass extra -> Pattern v -> Bool)
-> Pattern v
-> Pattern v
forall extra v.
GraphClassifier extra v
-> Substitution v
-> (GraphClass extra -> Pattern v -> Bool)
-> Pattern v
-> Pattern v
repairAnnotation GraphClassifier extra v
classifier Substitution v
subst GraphClass extra -> Pattern v -> Bool
keep Pattern v
p)]
GraphClass extra
_ -> [(GraphClass extra, Pattern v)
entry]
| Bool
otherwise = []
repairWalk
:: GraphClassifier extra v
-> Substitution v
-> (GraphClass extra -> Pattern v -> Bool)
-> Pattern v
-> Pattern v
repairWalk :: forall extra v.
GraphClassifier extra v
-> Substitution v
-> (GraphClass extra -> Pattern v -> Bool)
-> Pattern v
-> Pattern v
repairWalk GraphClassifier extra v
classifier Substitution v
subst GraphClass extra -> Pattern v -> Bool
keep (Pattern v
v [Pattern v]
rels) =
v -> [Pattern v] -> Pattern v
forall v. v -> [Pattern v] -> Pattern v
Pattern v
v ((Pattern v -> [Pattern v]) -> [Pattern v] -> [Pattern v]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (GraphClassifier extra v
-> Substitution v
-> (GraphClass extra -> Pattern v -> Bool)
-> Pattern v
-> [Pattern v]
forall extra v.
GraphClassifier extra v
-> Substitution v
-> (GraphClass extra -> Pattern v -> Bool)
-> Pattern v
-> [Pattern v]
repairRel GraphClassifier extra v
classifier Substitution v
subst GraphClass extra -> Pattern v -> Bool
keep) [Pattern v]
rels)
repairRel
:: GraphClassifier extra v
-> Substitution v
-> (GraphClass extra -> Pattern v -> Bool)
-> Pattern v
-> [Pattern v]
repairRel :: forall extra v.
GraphClassifier extra v
-> Substitution v
-> (GraphClass extra -> Pattern v -> Bool)
-> Pattern v
-> [Pattern v]
repairRel GraphClassifier extra v
classifier Substitution v
subst GraphClass extra -> Pattern v -> Bool
keep Pattern v
rel
| GraphClass extra -> Pattern v -> Bool
keep (GraphClassifier extra v -> Pattern v -> GraphClass extra
forall extra v.
GraphClassifier extra v -> Pattern v -> GraphClass extra
classify GraphClassifier extra v
classifier Pattern v
rel) Pattern v
rel = [Pattern v
rel]
| Bool
otherwise = case Substitution v
subst of
Substitution v
DeleteContainer -> []
Substitution v
SpliceGap -> []
ReplaceWithSurrogate Pattern v
s -> [Pattern v
s]
repairAnnotation
:: GraphClassifier extra v
-> Substitution v
-> (GraphClass extra -> Pattern v -> Bool)
-> Pattern v
-> Pattern v
repairAnnotation :: forall extra v.
GraphClassifier extra v
-> Substitution v
-> (GraphClass extra -> Pattern v -> Bool)
-> Pattern v
-> Pattern v
repairAnnotation GraphClassifier extra v
classifier Substitution v
subst GraphClass extra -> Pattern v -> Bool
keep (Pattern v
v [Pattern v]
els) =
v -> [Pattern v] -> Pattern v
forall v. v -> [Pattern v] -> Pattern v
Pattern v
v ((Pattern v -> [Pattern v]) -> [Pattern v] -> [Pattern v]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (GraphClassifier extra v
-> Substitution v
-> (GraphClass extra -> Pattern v -> Bool)
-> Pattern v
-> [Pattern v]
forall extra v.
GraphClassifier extra v
-> Substitution v
-> (GraphClass extra -> Pattern v -> Bool)
-> Pattern v
-> [Pattern v]
repairSub GraphClassifier extra v
classifier Substitution v
subst GraphClass extra -> Pattern v -> Bool
keep) [Pattern v]
els)
where
repairSub :: GraphClassifier extra v
-> Substitution v
-> (GraphClass extra -> Pattern v -> Bool)
-> Pattern v
-> [Pattern v]
repairSub GraphClassifier extra v
c Substitution v
s GraphClass extra -> Pattern v -> Bool
k Pattern v
e
| GraphClass extra -> Pattern v -> Bool
k (GraphClassifier extra v -> Pattern v -> GraphClass extra
forall extra v.
GraphClassifier extra v -> Pattern v -> GraphClass extra
classify GraphClassifier extra v
c Pattern v
e) Pattern v
e = [Pattern v
e]
| Bool
otherwise = case Substitution v
s of
Substitution v
DeleteContainer -> []
Substitution v
SpliceGap -> []
ReplaceWithSurrogate Pattern v
surr -> [Pattern v
surr]
foldGraph
:: Monoid m
=> (GraphClass extra -> Pattern v -> m)
-> GraphView extra v
-> m
foldGraph :: forall m extra v.
Monoid m =>
(GraphClass extra -> Pattern v -> m) -> GraphView extra v -> m
foldGraph GraphClass extra -> Pattern v -> m
f (GraphView GraphQuery v
_ [(GraphClass extra, Pattern v)]
elems) = ((GraphClass extra, Pattern v) -> m)
-> [(GraphClass extra, Pattern v)] -> m
forall m a. Monoid m => (a -> m) -> [a] -> m
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap (\(GraphClass extra
cls, Pattern v
p) -> GraphClass extra -> Pattern v -> m
f GraphClass extra
cls Pattern v
p) [(GraphClass extra, Pattern v)]
elems
mapWithContext
:: GraphClassifier extra v
-> (GraphQuery v -> Pattern v -> Pattern v)
-> GraphView extra v
-> GraphView extra v
mapWithContext :: forall extra v.
GraphClassifier extra v
-> (GraphQuery v -> Pattern v -> Pattern v)
-> GraphView extra v
-> GraphView extra v
mapWithContext GraphClassifier extra v
_classifier GraphQuery v -> Pattern v -> Pattern v
f view :: GraphView extra v
view@(GraphView GraphQuery v
q [(GraphClass extra, Pattern v)]
elems) =
GraphView extra v
view { viewElements = map (\(GraphClass extra
cls, Pattern v
p) -> (GraphClass extra
cls, GraphQuery v -> Pattern v -> Pattern v
f GraphQuery v
q Pattern v
p)) elems }
scopeDictFromGraphView :: GraphValue v => GraphView extra v -> ScopeDict (Id v) v
scopeDictFromGraphView :: forall v extra.
GraphValue v =>
GraphView extra v -> ScopeDict (Id v) v
scopeDictFromGraphView = GraphViewScope v -> ScopeDict (ScopeId GraphViewScope v) v
GraphViewScope v -> ScopeDict (Id v) v
forall (q :: * -> *) v.
ScopeQuery q v =>
q v -> ScopeDict (ScopeId q v) v
toScopeDict (GraphViewScope v -> ScopeDict (Id v) v)
-> (GraphView extra v -> GraphViewScope v)
-> GraphView extra v
-> ScopeDict (Id v) v
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GraphView extra v -> GraphViewScope v
forall v extra.
GraphValue v =>
GraphView extra v -> GraphViewScope v
graphViewScope
paraGraph
:: GraphValue v
=> (GraphQuery v -> Pattern v -> [r] -> r)
-> GraphView extra v
-> Map (Id v) r
paraGraph :: forall v r extra.
GraphValue v =>
(GraphQuery v -> Pattern v -> [r] -> r)
-> GraphView extra v -> Map (Id v) r
paraGraph GraphQuery v -> Pattern v -> [r] -> r
f GraphView extra v
view = (GraphQuery v -> Pattern v -> [r] -> r)
-> GraphView extra v -> Map (Id v) r -> Map (Id v) r
forall v r extra.
GraphValue v =>
(GraphQuery v -> Pattern v -> [r] -> r)
-> GraphView extra v -> Map (Id v) r -> Map (Id v) r
paraGraphWithSeed GraphQuery v -> Pattern v -> [r] -> r
f GraphView extra v
view Map (Id v) r
forall k a. Map k a
Map.empty
data GraphViewScope v = GraphViewScope
{ forall v. GraphViewScope v -> GraphQuery v
gvsQuery :: GraphQuery v
, forall v. GraphViewScope v -> [Pattern v]
gvsElements :: [Pattern v]
, forall v. GraphViewScope v -> Map (Id v) (Pattern v)
gvsIndex :: Map (Id v) (Pattern v)
, forall v. GraphViewScope v -> Map (Id v) [Pattern v]
gvsContainers :: Map (Id v) [Pattern v]
}
instance GraphValue v => ScopeQuery GraphViewScope v where
type ScopeId GraphViewScope v = Id v
containers :: GraphViewScope v -> Pattern v -> [Pattern v]
containers GraphViewScope v
scope Pattern v
p =
[Pattern v] -> Id v -> Map (Id v) [Pattern v] -> [Pattern v]
forall k a. Ord k => a -> k -> Map k a -> a
Map.findWithDefault [] (v -> Id v
forall v. GraphValue v => v -> Id v
identify (Pattern v -> v
forall v. Pattern v -> v
value Pattern v
p)) (GraphViewScope v -> Map (Id v) [Pattern v]
forall v. GraphViewScope v -> Map (Id v) [Pattern v]
gvsContainers GraphViewScope v
scope)
siblings :: GraphViewScope v -> Pattern v -> [Pattern v]
siblings GraphViewScope v
scope Pattern v
p =
[Pattern v] -> [Pattern v]
forall v. GraphValue v => [Pattern v] -> [Pattern v]
dedupeById
[ Pattern v
sibling
| Pattern v
container <- GraphViewScope v -> Pattern v -> [Pattern v]
forall (q :: * -> *) v.
ScopeQuery q v =>
q v -> Pattern v -> [Pattern v]
containers GraphViewScope v
scope Pattern v
p
, Pattern v
child <- Pattern v -> [Pattern v]
forall v. Pattern v -> [Pattern v]
elements Pattern v
container
, let childId :: Id v
childId = v -> Id v
forall v. GraphValue v => v -> Id v
identify (Pattern v -> v
forall v. Pattern v -> v
value Pattern v
child)
, Id v
childId Id v -> Id v -> Bool
forall a. Eq a => a -> a -> Bool
/= v -> Id v
forall v. GraphValue v => v -> Id v
identify (Pattern v -> v
forall v. Pattern v -> v
value Pattern v
p)
, Just Pattern v
sibling <- [Id v -> Map (Id v) (Pattern v) -> Maybe (Pattern v)
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup Id v
childId (GraphViewScope v -> Map (Id v) (Pattern v)
forall v. GraphViewScope v -> Map (Id v) (Pattern v)
gvsIndex GraphViewScope v
scope)]
]
byIdentity :: GraphViewScope v -> ScopeId GraphViewScope v -> Maybe (Pattern v)
byIdentity GraphViewScope v
scope ScopeId GraphViewScope v
i = Id v -> Map (Id v) (Pattern v) -> Maybe (Pattern v)
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup ScopeId GraphViewScope v
Id v
i (GraphViewScope v -> Map (Id v) (Pattern v)
forall v. GraphViewScope v -> Map (Id v) (Pattern v)
gvsIndex GraphViewScope v
scope)
allElements :: GraphViewScope v -> [Pattern v]
allElements = GraphViewScope v -> [Pattern v]
forall v. GraphViewScope v -> [Pattern v]
gvsElements
dedupeById :: GraphValue v => [Pattern v] -> [Pattern v]
dedupeById :: forall v. GraphValue v => [Pattern v] -> [Pattern v]
dedupeById = [Pattern v] -> [Pattern v]
forall a. [a] -> [a]
reverse ([Pattern v] -> [Pattern v])
-> ([Pattern v] -> [Pattern v]) -> [Pattern v] -> [Pattern v]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([Pattern v], Set (Id v)) -> [Pattern v]
forall a b. (a, b) -> a
fst (([Pattern v], Set (Id v)) -> [Pattern v])
-> ([Pattern v] -> ([Pattern v], Set (Id v)))
-> [Pattern v]
-> [Pattern v]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (([Pattern v], Set (Id v))
-> Pattern v -> ([Pattern v], Set (Id v)))
-> ([Pattern v], Set (Id v))
-> [Pattern v]
-> ([Pattern v], Set (Id v))
forall b a. (b -> a -> b) -> b -> [a] -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' ([Pattern v], Set (Id v)) -> Pattern v -> ([Pattern v], Set (Id v))
forall {v}.
GraphValue v =>
([Pattern v], Set (Id v)) -> Pattern v -> ([Pattern v], Set (Id v))
step ([], Set (Id v)
forall a. Set a
Set.empty)
where
step :: ([Pattern v], Set (Id v)) -> Pattern v -> ([Pattern v], Set (Id v))
step ([Pattern v]
acc, Set (Id v)
seen) Pattern v
p =
let pid :: Id v
pid = v -> Id v
forall v. GraphValue v => v -> Id v
identify (Pattern v -> v
forall v. Pattern v -> v
value Pattern v
p)
in if Id v -> Set (Id v) -> Bool
forall a. Ord a => a -> Set a -> Bool
Set.member Id v
pid Set (Id v)
seen
then ([Pattern v]
acc, Set (Id v)
seen)
else (Pattern v
p Pattern v -> [Pattern v] -> [Pattern v]
forall a. a -> [a] -> [a]
: [Pattern v]
acc, Id v -> Set (Id v) -> Set (Id v)
forall a. Ord a => a -> Set a -> Set a
Set.insert Id v
pid Set (Id v)
seen)
graphViewScope :: GraphValue v => GraphView extra v -> GraphViewScope v
graphViewScope :: forall v extra.
GraphValue v =>
GraphView extra v -> GraphViewScope v
graphViewScope (GraphView GraphQuery v
q [(GraphClass extra, Pattern v)]
taggedElems) = GraphViewScope
{ gvsQuery :: GraphQuery v
gvsQuery = GraphQuery v
q
, gvsElements :: [Pattern v]
gvsElements = [Pattern v]
elems
, gvsIndex :: Map (Id v) (Pattern v)
gvsIndex = Map (Id v) (Pattern v)
index
, gvsContainers :: Map (Id v) [Pattern v]
gvsContainers = Map (Id v) [Pattern v]
containerIndex
}
where
elems :: [Pattern v]
elems = ((GraphClass extra, Pattern v) -> Pattern v)
-> [(GraphClass extra, Pattern v)] -> [Pattern v]
forall a b. (a -> b) -> [a] -> [b]
map (GraphClass extra, Pattern v) -> Pattern v
forall a b. (a, b) -> b
snd [(GraphClass extra, Pattern v)]
taggedElems
index :: Map (Id v) (Pattern v)
index = (Map (Id v) (Pattern v) -> Pattern v -> Map (Id v) (Pattern v))
-> Map (Id v) (Pattern v) -> [Pattern v] -> Map (Id v) (Pattern v)
forall b a. (b -> a -> b) -> b -> [a] -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' Map (Id v) (Pattern v) -> Pattern v -> Map (Id v) (Pattern v)
forall {v}.
GraphValue v =>
Map (Id v) (Pattern v) -> Pattern v -> Map (Id v) (Pattern v)
insertUniqueElement Map (Id v) (Pattern v)
forall k a. Map k a
Map.empty [Pattern v]
elems
containerIndex :: Map (Id v) [Pattern v]
containerIndex = (Map (Id v) [Pattern v] -> Pattern v -> Map (Id v) [Pattern v])
-> Map (Id v) [Pattern v] -> [Pattern v] -> Map (Id v) [Pattern v]
forall b a. (b -> a -> b) -> b -> [a] -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' Map (Id v) [Pattern v] -> Pattern v -> Map (Id v) [Pattern v]
indexContainer Map (Id v) [Pattern v]
forall k a. Map k a
Map.empty [Pattern v]
elems
insertUniqueElement :: Map (Id v) (Pattern v) -> Pattern v -> Map (Id v) (Pattern v)
insertUniqueElement Map (Id v) (Pattern v)
acc Pattern v
p =
let pid :: Id v
pid = v -> Id v
forall v. GraphValue v => v -> Id v
identify (Pattern v -> v
forall v. Pattern v -> v
value Pattern v
p)
in case Id v -> Map (Id v) (Pattern v) -> Maybe (Pattern v)
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup Id v
pid Map (Id v) (Pattern v)
acc of
Maybe (Pattern v)
Nothing -> Id v
-> Pattern v -> Map (Id v) (Pattern v) -> Map (Id v) (Pattern v)
forall k a. Ord k => k -> a -> Map k a -> Map k a
Map.insert Id v
pid Pattern v
p Map (Id v) (Pattern v)
acc
Just Pattern v
_ ->
[Char] -> Map (Id v) (Pattern v)
forall a. HasCallStack => [Char] -> a
error [Char]
"scopeDictFromGraphView: duplicate element identity in GraphView"
indexContainer :: Map (Id v) [Pattern v] -> Pattern v -> Map (Id v) [Pattern v]
indexContainer Map (Id v) [Pattern v]
acc Pattern v
container =
(Map (Id v) [Pattern v] -> Pattern v -> Map (Id v) [Pattern v])
-> Map (Id v) [Pattern v] -> [Pattern v] -> Map (Id v) [Pattern v]
forall b a. (b -> a -> b) -> b -> [a] -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' (Pattern v
-> Map (Id v) [Pattern v] -> Pattern v -> Map (Id v) [Pattern v]
insertContainer Pattern v
container) Map (Id v) [Pattern v]
acc (Pattern v -> [Pattern v]
forall v. Pattern v -> [Pattern v]
elements Pattern v
container)
insertContainer :: Pattern v
-> Map (Id v) [Pattern v] -> Pattern v -> Map (Id v) [Pattern v]
insertContainer Pattern v
container Map (Id v) [Pattern v]
acc Pattern v
child =
let childId :: Id v
childId = v -> Id v
forall v. GraphValue v => v -> Id v
identify (Pattern v -> v
forall v. Pattern v -> v
value Pattern v
child)
in if Id v -> Map (Id v) (Pattern v) -> Bool
forall k a. Ord k => k -> Map k a -> Bool
Map.member Id v
childId Map (Id v) (Pattern v)
index
then ([Pattern v] -> [Pattern v] -> [Pattern v])
-> Id v
-> [Pattern v]
-> Map (Id v) [Pattern v]
-> Map (Id v) [Pattern v]
forall k a. Ord k => (a -> a -> a) -> k -> a -> Map k a -> Map k a
Map.insertWith [Pattern v] -> [Pattern v] -> [Pattern v]
forall a. [a] -> [a] -> [a]
(++) Id v
childId [Pattern v
container] Map (Id v) [Pattern v]
acc
else Map (Id v) [Pattern v]
acc
topoShapeSort :: GraphValue v
=> [(GraphClass extra, Pattern v)]
-> [(GraphClass extra, Pattern v)]
topoShapeSort :: forall v extra.
GraphValue v =>
[(GraphClass extra, Pattern v)] -> [(GraphClass extra, Pattern v)]
topoShapeSort [(GraphClass extra, Pattern v)]
elems =
let isNode' :: (GraphClass extra, b) -> Bool
isNode' (GraphClass extra
GNode, b
_) = Bool
True; isNode' (GraphClass extra, b)
_ = Bool
False
isRel' :: (GraphClass extra, b) -> Bool
isRel' (GraphClass extra
GRelationship, b
_) = Bool
True; isRel' (GraphClass extra, b)
_ = Bool
False
isWalk' :: (GraphClass extra, b) -> Bool
isWalk' (GraphClass extra
GWalk, b
_) = Bool
True; isWalk' (GraphClass extra, b)
_ = Bool
False
isAnnot' :: (GraphClass extra, b) -> Bool
isAnnot' (GraphClass extra
GAnnotation, b
_) = Bool
True; isAnnot' (GraphClass extra, b)
_ = Bool
False
isOther' :: (GraphClass extra, b) -> Bool
isOther' (GOther extra
_, b
_) = Bool
True; isOther' (GraphClass extra, b)
_ = Bool
False
in ((GraphClass extra, Pattern v) -> Bool)
-> [(GraphClass extra, Pattern v)]
-> [(GraphClass extra, Pattern v)]
forall a. (a -> Bool) -> [a] -> [a]
filter (GraphClass extra, Pattern v) -> Bool
forall {extra} {b}. (GraphClass extra, b) -> Bool
isNode' [(GraphClass extra, Pattern v)]
elems
[(GraphClass extra, Pattern v)]
-> [(GraphClass extra, Pattern v)]
-> [(GraphClass extra, Pattern v)]
forall a. [a] -> [a] -> [a]
++ ((GraphClass extra, Pattern v) -> Bool)
-> [(GraphClass extra, Pattern v)]
-> [(GraphClass extra, Pattern v)]
forall a. (a -> Bool) -> [a] -> [a]
filter (GraphClass extra, Pattern v) -> Bool
forall {extra} {b}. (GraphClass extra, b) -> Bool
isRel' [(GraphClass extra, Pattern v)]
elems
[(GraphClass extra, Pattern v)]
-> [(GraphClass extra, Pattern v)]
-> [(GraphClass extra, Pattern v)]
forall a. [a] -> [a] -> [a]
++ ((GraphClass extra, Pattern v) -> Bool)
-> [(GraphClass extra, Pattern v)]
-> [(GraphClass extra, Pattern v)]
forall a. (a -> Bool) -> [a] -> [a]
filter (GraphClass extra, Pattern v) -> Bool
forall {extra} {b}. (GraphClass extra, b) -> Bool
isWalk' [(GraphClass extra, Pattern v)]
elems
[(GraphClass extra, Pattern v)]
-> [(GraphClass extra, Pattern v)]
-> [(GraphClass extra, Pattern v)]
forall a. [a] -> [a] -> [a]
++ [(GraphClass extra, Pattern v)] -> [(GraphClass extra, Pattern v)]
forall v extra.
GraphValue v =>
[(GraphClass extra, Pattern v)] -> [(GraphClass extra, Pattern v)]
withinBucketTopoSort (((GraphClass extra, Pattern v) -> Bool)
-> [(GraphClass extra, Pattern v)]
-> [(GraphClass extra, Pattern v)]
forall a. (a -> Bool) -> [a] -> [a]
filter (GraphClass extra, Pattern v) -> Bool
forall {extra} {b}. (GraphClass extra, b) -> Bool
isAnnot' [(GraphClass extra, Pattern v)]
elems)
[(GraphClass extra, Pattern v)]
-> [(GraphClass extra, Pattern v)]
-> [(GraphClass extra, Pattern v)]
forall a. [a] -> [a] -> [a]
++ [(GraphClass extra, Pattern v)] -> [(GraphClass extra, Pattern v)]
forall v extra.
GraphValue v =>
[(GraphClass extra, Pattern v)] -> [(GraphClass extra, Pattern v)]
withinBucketTopoSort (((GraphClass extra, Pattern v) -> Bool)
-> [(GraphClass extra, Pattern v)]
-> [(GraphClass extra, Pattern v)]
forall a. (a -> Bool) -> [a] -> [a]
filter (GraphClass extra, Pattern v) -> Bool
forall {extra} {b}. (GraphClass extra, b) -> Bool
isOther' [(GraphClass extra, Pattern v)]
elems)
withinBucketTopoSort :: GraphValue v
=> [(GraphClass extra, Pattern v)]
-> [(GraphClass extra, Pattern v)]
withinBucketTopoSort :: forall v extra.
GraphValue v =>
[(GraphClass extra, Pattern v)] -> [(GraphClass extra, Pattern v)]
withinBucketTopoSort [] = []
withinBucketTopoSort [(GraphClass extra, Pattern v)]
elems =
let idMap :: Map (Id v) (GraphClass extra, Pattern v)
idMap = [(Id v, (GraphClass extra, Pattern v))]
-> Map (Id v) (GraphClass extra, Pattern v)
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList [ (v -> Id v
forall v. GraphValue v => v -> Id v
identify (Pattern v -> v
forall v. Pattern v -> v
value Pattern v
p), (GraphClass extra, Pattern v)
entry) | entry :: (GraphClass extra, Pattern v)
entry@(GraphClass extra
_, Pattern v
p) <- [(GraphClass extra, Pattern v)]
elems ]
inBucketDeps :: Map (Id v) [Id v]
inBucketDeps = [(Id v, [Id v])] -> Map (Id v) [Id v]
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList
[ ( v -> Id v
forall v. GraphValue v => v -> Id v
identify (Pattern v -> v
forall v. Pattern v -> v
value Pattern v
p)
, [ v -> Id v
forall v. GraphValue v => v -> Id v
identify (Pattern v -> v
forall v. Pattern v -> v
value Pattern v
e) | Pattern v
e <- Pattern v -> [Pattern v]
forall v. Pattern v -> [Pattern v]
elements Pattern v
p, Id v -> Map (Id v) (GraphClass extra, Pattern v) -> Bool
forall k a. Ord k => k -> Map k a -> Bool
Map.member (v -> Id v
forall v. GraphValue v => v -> Id v
identify (Pattern v -> v
forall v. Pattern v -> v
value Pattern v
e)) Map (Id v) (GraphClass extra, Pattern v)
idMap ]
)
| (GraphClass extra
_, Pattern v
p) <- [(GraphClass extra, Pattern v)]
elems
]
dependents :: Map (Id v) [Id v]
dependents = (Map (Id v) [Id v] -> (Id v, [Id v]) -> Map (Id v) [Id v])
-> Map (Id v) [Id v] -> [(Id v, [Id v])] -> Map (Id v) [Id v]
forall b a. (b -> a -> b) -> b -> [a] -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl'
(\Map (Id v) [Id v]
acc (Id v
pid, [Id v]
deps) -> (Map (Id v) [Id v] -> Id v -> Map (Id v) [Id v])
-> Map (Id v) [Id v] -> [Id v] -> Map (Id v) [Id v]
forall b a. (b -> a -> b) -> b -> [a] -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' (\Map (Id v) [Id v]
m Id v
dep -> ([Id v] -> [Id v] -> [Id v])
-> Id v -> [Id v] -> Map (Id v) [Id v] -> Map (Id v) [Id v]
forall k a. Ord k => (a -> a -> a) -> k -> a -> Map k a -> Map k a
Map.insertWith [Id v] -> [Id v] -> [Id v]
forall a. [a] -> [a] -> [a]
(++) Id v
dep [Id v
pid] Map (Id v) [Id v]
m) Map (Id v) [Id v]
acc [Id v]
deps)
(((GraphClass extra, Pattern v) -> [Id v])
-> Map (Id v) (GraphClass extra, Pattern v) -> Map (Id v) [Id v]
forall a b k. (a -> b) -> Map k a -> Map k b
Map.map ([Id v] -> (GraphClass extra, Pattern v) -> [Id v]
forall a b. a -> b -> a
const []) Map (Id v) (GraphClass extra, Pattern v)
idMap)
(Map (Id v) [Id v] -> [(Id v, [Id v])]
forall k a. Map k a -> [(k, a)]
Map.toList Map (Id v) [Id v]
inBucketDeps)
inDegree0 :: Map (Id v) Int
inDegree0 = ([Id v] -> Int) -> Map (Id v) [Id v] -> Map (Id v) Int
forall a b k. (a -> b) -> Map k a -> Map k b
Map.map [Id v] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length Map (Id v) [Id v]
inBucketDeps
initQueue :: [Id v]
initQueue = [ v -> Id v
forall v. GraphValue v => v -> Id v
identify (Pattern v -> v
forall v. Pattern v -> v
value Pattern v
p) | (GraphClass extra
_, Pattern v
p) <- [(GraphClass extra, Pattern v)]
elems
, Int -> Id v -> Map (Id v) Int -> Int
forall k a. Ord k => a -> k -> Map k a -> a
Map.findWithDefault Int
0 (v -> Id v
forall v. GraphValue v => v -> Id v
identify (Pattern v -> v
forall v. Pattern v -> v
value Pattern v
p)) Map (Id v) Int
inDegree0 Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0 ]
go :: [Id v]
-> Map (Id v) Int
-> [(GraphClass extra, Pattern v)]
-> [(GraphClass extra, Pattern v)]
go [] Map (Id v) Int
_ [(GraphClass extra, Pattern v)]
sortedRev = [(GraphClass extra, Pattern v)]
sortedRev
go (Id v
pid:[Id v]
queue) Map (Id v) Int
deg [(GraphClass extra, Pattern v)]
sortedRev =
let entry :: (GraphClass extra, Pattern v)
entry = Map (Id v) (GraphClass extra, Pattern v)
idMap Map (Id v) (GraphClass extra, Pattern v)
-> Id v -> (GraphClass extra, Pattern v)
forall k a. Ord k => Map k a -> k -> a
Map.! Id v
pid
newDeps :: [Id v]
newDeps = [Id v] -> Id v -> Map (Id v) [Id v] -> [Id v]
forall k a. Ord k => a -> k -> Map k a -> a
Map.findWithDefault [] Id v
pid Map (Id v) [Id v]
dependents
([Id v]
queue', Map (Id v) Int
deg') = (([Id v], Map (Id v) Int) -> Id v -> ([Id v], Map (Id v) Int))
-> ([Id v], Map (Id v) Int) -> [Id v] -> ([Id v], Map (Id v) Int)
forall b a. (b -> a -> b) -> b -> [a] -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl'
(\([Id v]
q, Map (Id v) Int
d) Id v
dep ->
let newD :: Int
newD = Int -> Id v -> Map (Id v) Int -> Int
forall k a. Ord k => a -> k -> Map k a -> a
Map.findWithDefault Int
0 Id v
dep Map (Id v) Int
d Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1
in if Int
newD Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0
then (Id v
dep Id v -> [Id v] -> [Id v]
forall a. a -> [a] -> [a]
: [Id v]
q, Id v -> Int -> Map (Id v) Int -> Map (Id v) Int
forall k a. Ord k => k -> a -> Map k a -> Map k a
Map.insert Id v
dep Int
newD Map (Id v) Int
d)
else ([Id v]
q, Id v -> Int -> Map (Id v) Int -> Map (Id v) Int
forall k a. Ord k => k -> a -> Map k a -> Map k a
Map.insert Id v
dep Int
newD Map (Id v) Int
d))
([Id v]
queue, Map (Id v) Int
deg)
[Id v]
newDeps
in [Id v]
-> Map (Id v) Int
-> [(GraphClass extra, Pattern v)]
-> [(GraphClass extra, Pattern v)]
go [Id v]
queue' Map (Id v) Int
deg' ((GraphClass extra, Pattern v)
entry (GraphClass extra, Pattern v)
-> [(GraphClass extra, Pattern v)]
-> [(GraphClass extra, Pattern v)]
forall a. a -> [a] -> [a]
: [(GraphClass extra, Pattern v)]
sortedRev)
sorted :: [(GraphClass extra, Pattern v)]
sorted = [(GraphClass extra, Pattern v)] -> [(GraphClass extra, Pattern v)]
forall a. [a] -> [a]
reverse ([Id v]
-> Map (Id v) Int
-> [(GraphClass extra, Pattern v)]
-> [(GraphClass extra, Pattern v)]
go [Id v]
initQueue Map (Id v) Int
inDegree0 [])
sortedSet :: Map (Id v) ()
sortedSet = [(Id v, ())] -> Map (Id v) ()
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList [ (v -> Id v
forall v. GraphValue v => v -> Id v
identify (Pattern v -> v
forall v. Pattern v -> v
value Pattern v
p), ()) | (GraphClass extra
_, Pattern v
p) <- [(GraphClass extra, Pattern v)]
sorted ]
cycleMembers :: [(GraphClass extra, Pattern v)]
cycleMembers = ((GraphClass extra, Pattern v) -> Bool)
-> [(GraphClass extra, Pattern v)]
-> [(GraphClass extra, Pattern v)]
forall a. (a -> Bool) -> [a] -> [a]
filter (\(GraphClass extra
_, Pattern v
p) -> Bool -> Bool
not (Id v -> Map (Id v) () -> Bool
forall k a. Ord k => k -> Map k a -> Bool
Map.member (v -> Id v
forall v. GraphValue v => v -> Id v
identify (Pattern v -> v
forall v. Pattern v -> v
value Pattern v
p)) Map (Id v) ()
sortedSet)) [(GraphClass extra, Pattern v)]
elems
in [(GraphClass extra, Pattern v)]
sorted [(GraphClass extra, Pattern v)]
-> [(GraphClass extra, Pattern v)]
-> [(GraphClass extra, Pattern v)]
forall a. [a] -> [a] -> [a]
++ [(GraphClass extra, Pattern v)]
cycleMembers
paraGraphFixed
:: (GraphValue v, Ord (Id v))
=> (r -> r -> Bool)
-> (GraphQuery v -> Pattern v -> [r] -> r)
-> r
-> GraphView extra v
-> Map (Id v) r
paraGraphFixed :: forall v r extra.
(GraphValue v, Ord (Id v)) =>
(r -> r -> Bool)
-> (GraphQuery v -> Pattern v -> [r] -> r)
-> r
-> GraphView extra v
-> Map (Id v) r
paraGraphFixed r -> r -> Bool
conv GraphQuery v -> Pattern v -> [r] -> r
f r
r0 GraphView extra v
view =
let initial :: Map (Id v) r
initial = [(Id v, r)] -> Map (Id v) r
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList
[ (v -> Id v
forall v. GraphValue v => v -> Id v
identify (Pattern v -> v
forall v. Pattern v -> v
value Pattern v
p), r
r0)
| (GraphClass extra
_, Pattern v
p) <- GraphView extra v -> [(GraphClass extra, Pattern v)]
forall extra v.
GraphView extra v -> [(GraphClass extra, Pattern v)]
viewElements GraphView extra v
view
]
in Map (Id v) r -> Map (Id v) r
go Map (Id v) r
initial
where
go :: Map (Id v) r -> Map (Id v) r
go Map (Id v) r
prev =
let next :: Map (Id v) r
next = (GraphQuery v -> Pattern v -> [r] -> r)
-> GraphView extra v -> Map (Id v) r -> Map (Id v) r
forall v r extra.
GraphValue v =>
(GraphQuery v -> Pattern v -> [r] -> r)
-> GraphView extra v -> Map (Id v) r -> Map (Id v) r
paraGraphWithSeed GraphQuery v -> Pattern v -> [r] -> r
f GraphView extra v
view Map (Id v) r
prev
in if Map (Id v) r -> Map (Id v) r -> Bool
converged Map (Id v) r
prev Map (Id v) r
next
then Map (Id v) r
next
else Map (Id v) r -> Map (Id v) r
go Map (Id v) r
next
converged :: Map (Id v) r -> Map (Id v) r -> Bool
converged Map (Id v) r
prev Map (Id v) r
next =
(Id v -> r -> Bool -> Bool) -> Bool -> Map (Id v) r -> Bool
forall k a b. (k -> a -> b -> b) -> b -> Map k a -> b
Map.foldrWithKey
(\Id v
k r
newVal Bool
acc ->
Bool
acc Bool -> Bool -> Bool
&& case Id v -> Map (Id v) r -> Maybe r
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup Id v
k Map (Id v) r
prev of
Maybe r
Nothing -> Bool
False
Just r
old -> r -> r -> Bool
conv r
old r
newVal)
Bool
True
Map (Id v) r
next
paraGraphWithSeed
:: GraphValue v
=> (GraphQuery v -> Pattern v -> [r] -> r)
-> GraphView extra v
-> Map (Id v) r
-> Map (Id v) r
paraGraphWithSeed :: forall v r extra.
GraphValue v =>
(GraphQuery v -> Pattern v -> [r] -> r)
-> GraphView extra v -> Map (Id v) r -> Map (Id v) r
paraGraphWithSeed GraphQuery v -> Pattern v -> [r] -> r
f GraphView extra v
view Map (Id v) r
seed =
(Map (Id v) r -> (GraphClass extra, Pattern v) -> Map (Id v) r)
-> Map (Id v) r -> [(GraphClass extra, Pattern v)] -> Map (Id v) r
forall b a. (b -> a -> b) -> b -> [a] -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' Map (Id v) r -> (GraphClass extra, Pattern v) -> Map (Id v) r
processElem Map (Id v) r
seed ([(GraphClass extra, Pattern v)] -> [(GraphClass extra, Pattern v)]
forall v extra.
GraphValue v =>
[(GraphClass extra, Pattern v)] -> [(GraphClass extra, Pattern v)]
topoShapeSort [(GraphClass extra, Pattern v)]
taggedElems)
where
q :: GraphQuery v
q = GraphView extra v -> GraphQuery v
forall extra v. GraphView extra v -> GraphQuery v
viewQuery GraphView extra v
view
taggedElems :: [(GraphClass extra, Pattern v)]
taggedElems = GraphView extra v -> [(GraphClass extra, Pattern v)]
forall extra v.
GraphView extra v -> [(GraphClass extra, Pattern v)]
viewElements GraphView extra v
view
processElem :: Map (Id v) r -> (GraphClass extra, Pattern v) -> Map (Id v) r
processElem Map (Id v) r
acc (GraphClass extra
_, Pattern v
p) =
let subResults :: [r]
subResults = (Pattern v -> Maybe r) -> [Pattern v] -> [r]
forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe (\Pattern v
e -> Id v -> Map (Id v) r -> Maybe r
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup (v -> Id v
forall v. GraphValue v => v -> Id v
identify (Pattern v -> v
forall v. Pattern v -> v
value Pattern v
e)) Map (Id v) r
acc) (Pattern v -> [Pattern v]
forall v. Pattern v -> [Pattern v]
elements Pattern v
p)
r :: r
r = GraphQuery v -> Pattern v -> [r] -> r
f GraphQuery v
q Pattern v
p [r]
subResults
in Id v -> r -> Map (Id v) r -> Map (Id v) r
forall k a. Ord k => k -> a -> Map k a -> Map k a
Map.insert (v -> Id v
forall v. GraphValue v => v -> Id v
identify (Pattern v -> v
forall v. Pattern v -> v
value Pattern v
p)) r
r Map (Id v) r
acc