Changeset 9005 for src/Pugs/Prim/Yaml.hs
- Timestamp:
- 02/15/06 14:13:33 (3 years ago)
- Files:
-
- 1 modified
-
src/Pugs/Prim/Yaml.hs (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Pugs/Prim/Yaml.hs
r8999 r9005 67 67 dumpYaml :: Int -> Val -> Eval Val 68 68 dumpYaml limit v = do 69 done <- liftSTM $ newTVar IntMap.empty70 69 let ?seen = IntSet.empty 71 ?done = done 72 obj <- toYaml v 73 nodeMap <- liftSTM . readTVar $ done 74 let replaceNode node@MkYamlNode{ nid = n } 75 | n == 0 = node 76 | otherwise = (IntMap.!) nodeMap (fromEnum n) 77 rv <- liftIO . emitYaml $ everywhere (mkT replaceNode) obj 70 obj <- toYaml v 71 rv <- liftIO . emitYaml $ obj 78 72 either (fail . ("YAML Emit Error: "++)) 79 73 (return . VStr . decodeUTF8) rv … … 87 81 return (castStablePtrToPtr ptr `minusPtr` (nullPtr :: Ptr ())) 88 82 89 toYaml :: (?seen :: IntSet.IntSet , ?done :: TVar (IntMap.IntMap YamlNode)) => Val -> Eval YamlNode83 toYaml :: (?seen :: IntSet.IntSet) => Val -> Eval YamlNode 90 84 toYaml VUndef = return $ mkNode YamlNil 91 85 toYaml (VBool x) = return $ boolToYaml x … … 93 87 toYaml v@(VRef r) = do 94 88 ptr <- liftIO $ addressOf r 95 if IntSet.member ptr ?seen then return nilNode{ nid = toEnum ptr} else do89 if IntSet.member ptr ?seen then return nilNode{ anchor = Just (MkYamlReference ptr) } else do 96 90 let ?seen = IntSet.insert ptr ?seen 97 91 node <- ifValTypeIsa v "Hash" (hashToYaml r) $ do … … 101 95 VObject _ -> nodes 102 96 _ -> mkNode $ YamlMap [(strNode "<ref>", nodes)] 103 liftSTM $ modifyTVar ?done (IntMap.insert ptr node) 104 return node 97 return node{ anchor = Just (MkYamlAnchor ptr) } 105 98 toYaml (VList nodes) = do 106 99 n <- mapM toYaml nodes … … 125 118 toYaml v = return $ strNode $ (encodeUTF8 . pretty) v 126 119 127 hashToYaml :: (?seen :: IntSet.IntSet , ?done :: TVar (IntMap.IntMap YamlNode)) => VRef -> Eval YamlNode120 hashToYaml :: (?seen :: IntSet.IntSet) => VRef -> Eval YamlNode 128 121 hashToYaml (MkRef (IHash hv)) = do 129 122 h <- hash_fetch hv
