feat(zig): native Arboricx bundle parser and C ABI
This commit is contained in:
@@ -12,6 +12,7 @@ import System.Console.CmdArgs (Data, Typeable)
|
||||
|
||||
import qualified Data.ByteString as BS
|
||||
import qualified Data.Map as Map
|
||||
import qualified Data.Set as Set
|
||||
import qualified Data.Text as T
|
||||
|
||||
-- Tree Calculus Types
|
||||
@@ -296,3 +297,41 @@ decodeResult tc =
|
||||
|| n == 9
|
||||
|| n == 10
|
||||
|| n == 13
|
||||
|
||||
-- ---------------------------------------------------------------------------
|
||||
-- DAG node-table export (for host-language kernel embedding)
|
||||
-- ---------------------------------------------------------------------------
|
||||
|
||||
-- | Export a term's Merkle DAG as a topologically-sorted node table.
|
||||
-- Children appear before parents so all index references are forward.
|
||||
-- Returns (root index, list of (tag, [child_indices])).
|
||||
exportDag :: T -> (Int, [(String, [Int])])
|
||||
exportDag term =
|
||||
let (root, acc, _) = collectDag term [] Set.empty
|
||||
-- acc is in reverse post-order (children first, root last)
|
||||
ordered = reverse acc
|
||||
idxMap = Map.fromList [(h, i) | (i, (h, _)) <- zip [0..] ordered]
|
||||
rootIdx = idxMap Map.! root
|
||||
lines_ = map (formatNode idxMap . snd) ordered
|
||||
in (rootIdx, lines_)
|
||||
where
|
||||
collectDag :: T -> [(MerkleHash, Node)] -> Set.Set MerkleHash -> (MerkleHash, [(MerkleHash, Node)], Set.Set MerkleHash)
|
||||
collectDag Leaf acc seen =
|
||||
let h = nodeHash NLeaf
|
||||
in if Set.member h seen then (h, acc, seen) else (h, (h, NLeaf) : acc, Set.insert h seen)
|
||||
collectDag (Stem t) acc seen =
|
||||
let (ch, acc', seen') = collectDag t acc seen
|
||||
node = NStem ch
|
||||
h = nodeHash node
|
||||
in if Set.member h seen' then (h, acc', seen') else (h, (h, node) : acc', Set.insert h seen')
|
||||
collectDag (Fork l r) acc seen =
|
||||
let (lh, acc', seen') = collectDag l acc seen
|
||||
(rh, acc'', seen'') = collectDag r acc' seen'
|
||||
node = NFork lh rh
|
||||
h = nodeHash node
|
||||
in if Set.member h seen'' then (h, acc'', seen'') else (h, (h, node) : acc'', Set.insert h seen'')
|
||||
|
||||
formatNode :: Map.Map MerkleHash Int -> Node -> (String, [Int])
|
||||
formatNode _ NLeaf = ("leaf", [])
|
||||
formatNode idxMap (NStem ch) = ("stem", [idxMap Map.! ch])
|
||||
formatNode idxMap (NFork l r) = ("fork", [idxMap Map.! l, idxMap Map.! r])
|
||||
|
||||
Reference in New Issue
Block a user