module RJSONConvert
( rJsonToTree
, decodeRJsonTree
, getRJsonTree
) where
import Data.Maybe
import qualified Data.Sequence as Seq
import Data.Tree
import Debug.Trace
import qualified Data.Vector as V
import qualified Data.ByteString.Lazy.Char8 as C
import qualified Data.Text as T
import TextShow (showt)
import Math.TreeFun.Types
import Math.TreeFun.Tree
import Data.Aeson
import Data.Aeson.Types
import Types
rJsonToTree :: Object -> Tree NodeLabel
rJsonToTree object =
Node { rootLabel = getNodeLabel object
, subForest = fmap rJsonToTree . getChildren $ object
}
getNodeLabel :: Object -> NodeLabel
getNodeLabel object = do
NodeLabel { nodeID = ""
, nodeLabels = getLabel object
}
getLabel :: Object -> Labels
getLabel object = Seq.fromList
. V.toList
. either error id
. flip parseEither object $ \obj -> do
labels <- obj .: "name"
return labels
getChildren :: Object -> [Object]
getChildren object = either (const []) id
. flip parseEither object $ \obj -> do
children <- obj .: "children"
return children
decodeRJsonTree :: C.ByteString -> Object
decodeRJsonTree contents = fromMaybe
(error "Input is not a JSON object")
(decode contents :: Maybe Object)
getRJsonTree :: Object -> Tree NodeLabel
getRJsonTree object = rJsonToTree object