hasbolt-0.1.0.7: src/Database/Bolt/Value/Type.hs
module Database.Bolt.Value.Type where
import Control.Monad.Trans.State (StateT (..), evalStateT)
import Data.ByteString (ByteString)
import Data.Map.Strict (Map)
import Data.Text (Text)
import Data.Word (Word8)
-- |The 'UnpackT' transformer helps to unpack a set of values from one 'ByteString'
type UnpackT = StateT ByteString
-- |The 'Structure' datatype describes Neo4j structure for BOLT protocol
data Structure = Structure { signature :: Word8
, fields :: [Value]
}
deriving (Show, Eq)
-- |Generalizes all datatypes that can be deserialized from 'Structure's.
class FromStructure a where
fromStructure :: Monad m => Structure -> m a
-- |Generalizes all datatypes that can be serialized to 'Structure's.
class ToStructure a where
toStructure :: a -> Structure
-- |The 'BoltValue' class describes values, that can be packed and unpacked for BOLT protocol.
class BoltValue a where
-- |Packs a value to 'ByteString'
pack :: a -> ByteString
-- |Unpacks in a State monad to get values from single 'ByteString'
unpackT :: Monad m => UnpackT m a
-- |Unpacks a 'ByteString' to selected value
unpack :: Monad m => ByteString -> m a
unpack = evalStateT unpackT
-- |The 'Value' datatype generalizes all primitive 'BoltValue's
data Value = N ()
| B Bool
| I Int
| F Double
| T Text
| L [Value]
| M (Map Text Value)
| S Structure
deriving (Show, Eq)
-- = Structure types
-- == Neo4j subjects
data Node = Node { nodeIdentity :: Int -- ^Neo4j node identifier
, labels :: [Text] -- ^Set of node labels (types)
, nodeProps :: Map Text Value -- ^Dict of node properties
}
deriving (Show, Eq)
data Relationship = Relationship { relIdentity :: Int -- ^Neo4j relationship identifier
, startNodeId :: Int -- ^Identifier of start node
, endNodeId :: Int -- ^Identifier of end node
, relType :: Text -- ^Relationship type
, relProps :: Map Text Value -- ^Dict of relationship properties
}
deriving (Show, Eq)
data URelationship = URelationship { urelIdentity :: Int -- ^Neo4j relationship identifier
, urelType :: Text -- ^Relationship type
, urelProps :: Map Text Value -- ^Dict of relationship properties
}
deriving (Show, Eq)
data Path = Path { pathNodes :: [Node] -- ^Chain of 'Node's in path
, pathRelationships :: [URelationship] -- ^Chain of 'Relationship's in path
, pathSequence :: [Int] -- ^Path sequence
}
deriving (Show, Eq)