module XmlParser.NodeConsumerState
  ( NodeConsumerState,
    new,
    bumpOffset,
    getOffset,
    fetchNode,
    lookupNamespace,
    getNamespaceRegistry,
  )
where

import qualified Text.XML as Xml
import qualified XmlParser.NamespaceRegistry as NamespaceRegistry
import XmlParser.Prelude

data NodeConsumerState
  = NodeConsumerState
      [Xml.Node]
      -- ^ Nodes.
      Int
      -- ^ Offset.
      NamespaceRegistry.NamespaceRegistry
      -- ^ Namespace registry.

new :: [Xml.Node] -> NamespaceRegistry.NamespaceRegistry -> NodeConsumerState
new :: [Node] -> NamespaceRegistry -> NodeConsumerState
new [Node]
nodes NamespaceRegistry
nsReg = [Node] -> Int -> NamespaceRegistry -> NodeConsumerState
NodeConsumerState [Node]
nodes Int
0 NamespaceRegistry
nsReg

bumpOffset :: NodeConsumerState -> NodeConsumerState
bumpOffset :: NodeConsumerState -> NodeConsumerState
bumpOffset (NodeConsumerState [Node]
a Int
b NamespaceRegistry
c) = [Node] -> Int -> NamespaceRegistry -> NodeConsumerState
NodeConsumerState [Node]
a (Int -> Int
forall a. Enum a => a -> a
succ Int
b) NamespaceRegistry
c

getOffset :: NodeConsumerState -> Int
getOffset :: NodeConsumerState -> Int
getOffset (NodeConsumerState [Node]
_ Int
x NamespaceRegistry
_) = Int
x

fetchNode :: NodeConsumerState -> Maybe (Xml.Node, NodeConsumerState)
fetchNode :: NodeConsumerState -> Maybe (Node, NodeConsumerState)
fetchNode (NodeConsumerState [Node]
nodes Int
offset NamespaceRegistry
nsReg) =
  case [Node]
nodes of
    Node
nodesHead : [Node]
nodesTail -> (Node, NodeConsumerState) -> Maybe (Node, NodeConsumerState)
forall a. a -> Maybe a
Just (Node
nodesHead, [Node] -> Int -> NamespaceRegistry -> NodeConsumerState
NodeConsumerState [Node]
nodesTail Int
offset NamespaceRegistry
nsReg)
    [Node]
_ -> Maybe (Node, NodeConsumerState)
forall a. Maybe a
Nothing

lookupNamespace :: Text -> NodeConsumerState -> Maybe Text
lookupNamespace :: Text -> NodeConsumerState -> Maybe Text
lookupNamespace Text
ns (NodeConsumerState [Node]
_ Int
_ NamespaceRegistry
nsReg) =
  Text -> NamespaceRegistry -> Maybe Text
NamespaceRegistry.lookup Text
ns NamespaceRegistry
nsReg

getNamespaceRegistry :: NodeConsumerState -> NamespaceRegistry.NamespaceRegistry
getNamespaceRegistry :: NodeConsumerState -> NamespaceRegistry
getNamespaceRegistry (NodeConsumerState [Node]
_ Int
_ NamespaceRegistry
x) = NamespaceRegistry
x