Changeset 9005 for src/Pugs/Prim/Yaml.hs

Show
Ignore:
Timestamp:
02/15/06 14:13:33 (3 years ago)
Author:
audreyt
Message:

* Dumping recursive Yaml structures now Really Works (tm)

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • src/Pugs/Prim/Yaml.hs

    r8999 r9005  
    6767dumpYaml :: Int -> Val -> Eval Val 
    6868dumpYaml limit v = do 
    69     done        <- liftSTM $ newTVar IntMap.empty 
    7069    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 
    7872    either (fail . ("YAML Emit Error: "++)) 
    7973           (return . VStr . decodeUTF8) rv 
     
    8781    return (castStablePtrToPtr ptr `minusPtr` (nullPtr :: Ptr ())) 
    8882 
    89 toYaml :: (?seen :: IntSet.IntSet, ?done :: TVar (IntMap.IntMap YamlNode)) => Val -> Eval YamlNode 
     83toYaml :: (?seen :: IntSet.IntSet) => Val -> Eval YamlNode 
    9084toYaml VUndef       = return $ mkNode YamlNil 
    9185toYaml (VBool x)    = return $ boolToYaml x 
     
    9387toYaml v@(VRef r)   = do 
    9488    ptr <- liftIO $ addressOf r 
    95     if IntSet.member ptr ?seen then return nilNode{ nid = toEnum ptr } else do 
     89    if IntSet.member ptr ?seen then return nilNode{ anchor = Just (MkYamlReference ptr) } else do 
    9690        let ?seen = IntSet.insert ptr ?seen 
    9791        node <- ifValTypeIsa v "Hash" (hashToYaml r) $ do 
     
    10195                VObject _   -> nodes 
    10296                _           -> mkNode $ YamlMap [(strNode "<ref>", nodes)] 
    103         liftSTM $ modifyTVar ?done (IntMap.insert ptr node) 
    104         return node 
     97        return node{ anchor = Just (MkYamlAnchor ptr) } 
    10598toYaml (VList nodes) = do 
    10699    n <- mapM toYaml nodes 
     
    125118toYaml v = return $ strNode $ (encodeUTF8 . pretty) v 
    126119 
    127 hashToYaml :: (?seen :: IntSet.IntSet, ?done :: TVar (IntMap.IntMap YamlNode)) => VRef -> Eval YamlNode 
     120hashToYaml :: (?seen :: IntSet.IntSet) => VRef -> Eval YamlNode 
    128121hashToYaml (MkRef (IHash hv)) = do 
    129122    h <- hash_fetch hv