module Network.IPFS.DAG.Node.Types (Node (..)) where

import Network.IPFS.Prelude

import Data.Vector
import Network.IPFS.DAG.Link.Types as DAG


data Node = Node
  { Node -> Text
dataBlock :: Text
  , Node -> [Link]
links :: [DAG.Link]
  } deriving (Int -> Node -> ShowS
[Node] -> ShowS
Node -> String
(Int -> Node -> ShowS)
-> (Node -> String) -> ([Node] -> ShowS) -> Show Node
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Node] -> ShowS
$cshowList :: [Node] -> ShowS
show :: Node -> String
$cshow :: Node -> String
showsPrec :: Int -> Node -> ShowS
$cshowsPrec :: Int -> Node -> ShowS
Show, Node -> Node -> Bool
(Node -> Node -> Bool) -> (Node -> Node -> Bool) -> Eq Node
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Node -> Node -> Bool
$c/= :: Node -> Node -> Bool
== :: Node -> Node -> Bool
$c== :: Node -> Node -> Bool
Eq)

instance ToJSON Node where
  toJSON :: Node -> Value
toJSON (Node Text
dataBlock [Link]
links) = 
    Object -> Value
Object [ (Text
"data", Text -> Value
String Text
dataBlock)
           , (Text
"links", Array -> Value
Array (Array -> Value) -> ([Value] -> Array) -> [Value] -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Value] -> Array
forall a. [a] -> Vector a
fromList ([Value] -> Value) -> [Value] -> Value
forall a b. (a -> b) -> a -> b
<| Link -> Value
forall a. ToJSON a => a -> Value
toJSON (Link -> Value) -> [Link] -> [Value]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Link]
links)
           ]