Changeset 8999 for src/Pugs/Prim/Yaml.hs
- Timestamp:
- 02/14/06 21:23:12 (3 years ago)
- Files:
-
- 1 modified
-
src/Pugs/Prim/Yaml.hs (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Pugs/Prim/Yaml.hs
r8994 r8999 3 3 4 4 module Pugs.Prim.Yaml ( 5 evalYaml, dumpYaml 5 evalYaml, dumpYaml, addressOf, 6 6 ) where 7 7 import Pugs.Internals … … 11 11 import Data.Yaml.Syck 12 12 import qualified Data.Map as Map 13 import qualified Data.IntSet as IntSet 13 14 import qualified Data.IntMap as IntMap 14 15 import Foreign.StablePtr 15 16 import Foreign.Ptr 17 import Data.Generics 16 18 17 19 evalYaml :: Val -> Eval Val … … 65 67 dumpYaml :: Int -> Val -> Eval Val 66 68 dumpYaml limit v = do 67 obj <- toYaml IntMap.empty v 68 rv <- liftIO (emitYaml obj) 69 done <- liftSTM $ newTVar IntMap.empty 70 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 69 78 either (fail . ("YAML Emit Error: "++)) 70 79 (return . VStr . decodeUTF8) rv … … 78 87 return (castStablePtrToPtr ptr `minusPtr` (nullPtr :: Ptr ())) 79 88 80 toYaml :: IntMap YamlNode -> Val -> Eval YamlNode81 toYaml _VUndef = return $ mkNode YamlNil82 toYaml _(VBool x) = return $ boolToYaml x83 toYaml _(VStr str) = return $ strNode (encodeUTF8 str)84 toYaml seenv@(VRef r) = do89 toYaml :: (?seen :: IntSet.IntSet, ?done :: TVar (IntMap.IntMap YamlNode)) => Val -> Eval YamlNode 90 toYaml VUndef = return $ mkNode YamlNil 91 toYaml (VBool x) = return $ boolToYaml x 92 toYaml (VStr str) = return $ strNode (encodeUTF8 str) 93 toYaml v@(VRef r) = do 85 94 ptr <- liftIO $ addressOf r 86 case IntMap.lookup ptr seen of87 Just node -> return node88 Nothing ->do89 rv <- ifValTypeIsa v "Hash" (hashToYaml seen r) $ do90 v' <- readRef r91 nodes <- toYaml seen v' -- XXX -- (IntMap.insert ptr rv seen) v'92 ifValTypeIsa v "Array" (return nodes) . return $ case v' of93 VObject _ -> nodes94 _ -> mkNode $ YamlMap [(strNode "<ref>", nodes)]95 return rv96 toYaml seen(VList nodes) = do97 n <- mapM (toYaml seen)nodes95 if IntSet.member ptr ?seen then return nilNode{ nid = toEnum ptr } else do 96 let ?seen = IntSet.insert ptr ?seen 97 node <- ifValTypeIsa v "Hash" (hashToYaml r) $ do 98 v' <- readRef r 99 nodes <- toYaml v' 100 ifValTypeIsa v "Array" (return nodes) . return $ case v' of 101 VObject _ -> nodes 102 _ -> mkNode $ YamlMap [(strNode "<ref>", nodes)] 103 liftSTM $ modifyTVar ?done (IntMap.insert ptr node) 104 return node 105 toYaml (VList nodes) = do 106 n <- mapM toYaml nodes 98 107 return $ mkNode (YamlSeq n) 99 108 -- fmap YamlSeq$ mapM toYaml nodes 100 toYaml seenv@(VObject obj) = do109 toYaml v@(VObject obj) = do 101 110 -- ... dump the objAttrs 102 111 -- XXX this needs fixing WRT demagicalized pairs: … … 104 113 -- parens, which is, of course, wrong. 105 114 hash <- fromVal v :: Eval VHash 106 attrs <- toYaml seen$ VRef (hashRef hash)115 attrs <- toYaml $ VRef (hashRef hash) 107 116 return $ tagNode (Just $ "tag:pugs:object:" ++ showType (objType obj)) attrs 108 toYaml seen(VRule MkRulePGE{rxRule=rule, rxGlobal=global, rxStringify=stringify, rxAdverbs=adverbs}) =do109 adverbs' <- toYaml seenadverbs117 toYaml (VRule MkRulePGE{rxRule=rule, rxGlobal=global, rxStringify=stringify, rxAdverbs=adverbs}) =do 118 adverbs' <- toYaml adverbs 110 119 return . mkTagNode "tag:pugs:Rule" $ YamlMap 111 120 [ (strNode "rule", strNode rule) … … 114 123 , (strNode "adverbs", adverbs') 115 124 ] 116 toYaml _v = return $ strNode $ (encodeUTF8 . pretty) v125 toYaml v = return $ strNode $ (encodeUTF8 . pretty) v 117 126 118 hashToYaml :: IntMap YamlNode -> VRef -> Eval YamlNode119 hashToYaml seen(MkRef (IHash hv)) = do127 hashToYaml :: (?seen :: IntSet.IntSet, ?done :: TVar (IntMap.IntMap YamlNode)) => VRef -> Eval YamlNode 128 hashToYaml (MkRef (IHash hv)) = do 120 129 h <- hash_fetch hv 121 130 let assocs = Map.toList h 122 131 yamlmap <- forM assocs $ \(ka, va) -> do 123 ka' <- toYaml seen$ VStr ka124 va' <- toYaml seenva132 ka' <- toYaml $ VStr ka 133 va' <- toYaml va 125 134 return (ka', va') 126 135 return $ mkNode (YamlMap yamlmap) 127 hashToYaml _r = error ("unexpected node: " ++ show r)136 hashToYaml r = error ("unexpected node: " ++ show r) 128 137 129 138 boolToYaml :: VBool -> YamlNode
