aboutsummaryrefslogtreecommitdiffstats
path: root/src/Data/JLD/NodeMap.hs
blob: 0c40c9af8caf5538bd2a19854c06db1435b883a9 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
module Data.JLD.NodeMap (NodeMap, BNMParams (..)) where

import Data.JLD.Prelude

import Data.JLD.Control.Monad.RES (REST, execREST, runREST, withEnvRES, withErrorRES, withErrorRES', withStateRES)
import Data.JLD.Error (JLDError (..))
import Data.JLD.Model.ActiveContext (ActiveContext (..), containsProtectedTerm, lookupTerm, newActiveContext)
import Data.JLD.Model.Direction (Direction (..))
import Data.JLD.Model.IRI (CompactIRI (..), endsWithGenericDelim, isBlankIri, parseCompactIri)
import Data.JLD.Model.Keyword (Keyword (..), allKeywords, isKeyword, isKeywordLike, isNotKeyword, parseKeyword)
import Data.JLD.Model.Language (Language (..))
import Data.JLD.Model.TermDefinition (TermDefinition (..), newTermDefinition)
import Data.JLD.Model.URI (parseUri, uriToIri)
import Data.JLD.Options (ContextCache, Document (..), DocumentCache, DocumentLoader (..), JLDVersion (..))
import Data.JLD.Util (flattenSingletonArray, valueContains, valueContainsAny, valueIsTrue, valueToArray)

import Control.Monad.Except (MonadError (..))
import Data.Aeson (Object, Value (..))
import Data.Aeson.Key qualified as K (fromText, toText)
import Data.Aeson.KeyMap qualified as KM (delete, keys, lookup, member, size)
import Data.Map.Strict qualified as M (delete, insert, lookup)
import Data.RDF (parseIRI, parseRelIRI, resolveIRI, serializeIRI, validateIRI)
import Data.Set qualified as S (insert, member, notMember, size)
import Data.Text qualified as T (drop, dropEnd, elem, findIndex, isPrefixOf, null, take, toLower)
import Data.Vector qualified as V (length)
import Text.URI (URI, isPathAbsolute, relativeTo)
import Text.URI qualified as U (render)

type NodeMap = Map (Text, Text, Text) Value

type BNMT e m = REST BNMEnv (JLDError e) BNMState m

data BNMEnv = BNMEnv
    { bnmEnvDocument :: Value
    , bnmEnvActiveGraph :: Text
    , bnmEnvActiveSubject :: Maybe Text
    , bnmEnvActiveProperty :: Maybe Text
    }
    deriving (Show)

newtype BNMState = BNMState
    { bnmStateNodeMap :: NodeMap
    }
    deriving (Show, Eq)

data BNMParams = BNMParams
    { bnmParamsNodeMap :: NodeMap
    , bnmParamsActiveGraph :: Text
    , bnmParamsActiveSubject :: Maybe Text
    , bnmParamsActiveProperty :: Maybe Text
    , bnmParamsList :: Map Text Value
    }
    deriving (Show, Eq)

bnmModifyNodeMap :: Monad m => (NodeMap -> NodeMap) -> BNMT e m ()
bnmModifyNodeMap fn = modify \s -> s{bnmStateNodeMap = fn (bnmStateNodeMap s)}

buildNodeMap' :: Monad m => BNMT e m ()
buildNodeMap' = do
    pure ()

buildNodeMap :: Monad m => Value -> (BNMParams -> BNMParams) -> m NodeMap
buildNodeMap document paramsFn = do
    BNMState{..} <- buildNodeMap' |> execREST env st
    pure bnmStateNodeMap
  where
    BNMParams{..} =
        paramsFn
            BNMParams
                { bnmParamsNodeMap = mempty
                , bnmParamsActiveGraph = show KeywordDefault
                , bnmParamsActiveSubject = Nothing
                , bnmParamsActiveProperty = Nothing
                , bnmParamsList = mempty
                }

    env =
        BNMEnv
            { bnmEnvDocument = document
            , bnmEnvActiveGraph = bnmParamsActiveGraph
            , bnmEnvActiveSubject = bnmParamsActiveSubject
            , bnmEnvActiveProperty = bnmParamsActiveProperty
            }

    st =
        BNMState
            { bnmStateNodeMap = bnmParamsNodeMap
            }