Changeset 8600 for src/Pugs/Prim/Yaml.hs
- Timestamp:
- 01/07/06 09:46:00 (3 years ago)
- Files:
-
- 1 modified
-
src/Pugs/Prim/Yaml.hs (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Pugs/Prim/Yaml.hs
r8593 r8600 8 8 import Pugs.AST 9 9 import Pugs.Pretty 10 import Pugs.Types 10 11 import Data.Yaml.Syck 11 12 import qualified Data.Map as Map … … 22 23 23 24 fromYaml :: YamlNode -> Eval Val 25 fromYaml YamlNil = return VUndef 24 26 fromYaml (YamlStr str) = return $ VStr (decodeUTF8 str) 25 27 fromYaml (YamlSeq nodes) = do … … 28 30 IntMap.fromAscList ([0..] `zip` map lazyScalar vals) 29 31 return $ VRef (arrayRef av) 30 fromYaml (YamlMap nodes) = do32 fromYaml (YamlMap _ nodes) = do 31 33 vals <- forM nodes $ \(keyNode, valNode) -> do 32 34 key <- fromVal =<< fromYaml keyNode … … 34 36 return (key, val) 35 37 hv <- liftSTM $ (newTVar (Map.fromList vals) :: STM IHash) 38 -- XXX: if YamlMap (Just "!perl/":type) nodes then mkObject etc. 36 39 return $ VRef (hashRef hv) 37 40 … … 54 57 trace ("toYaml VRef: " ++ (show v) ++ " type=" ++ (show t)) $ return () 55 58 (ifValTypeIsa v "Hash" 56 (do 57 case r of 58 MkRef (IHash hv) -> do 59 h <- hash_fetch hv 60 let assocs = Map.toList h 61 yamlmap <- mapM ( \(k, v) -> do 62 k' <- toYaml d (VStr k) 63 v' <- toYaml d v 64 return (k', v')) assocs 65 return $ YamlMap yamlmap 66 _ -> error ("can't process hash: " ++ show v') -- XXX 59 (case r of 60 -- "My brain just exploded. I can't handle pattern bindings for existentially-quantified constructors." 61 -- let (MkRef (IHash hv)) = r 62 -- XXX golfme for readability! 63 MkRef (IHash hv) -> do 64 h <- hash_fetch hv 65 let assocs = Map.toList h 66 yamlmap <- flip mapM assocs (\(ka, va) -> do 67 ka' <- toYaml d (VStr ka) 68 va' <- toYaml d va 69 return (ka', va')) 70 return $ YamlMap Nothing yamlmap 71 _ -> error ("unexpected node: " ++ show v) 67 72 ) 68 73 (do nodes <- toYaml d v' 69 ifValTypeIsa v "Array" 70 (return $ nodes) 71 (return $ YamlMap [(YamlStr "<ref>", nodes)])) -- XXX 72 ) 74 (ifValTypeIsa v "Array" 75 (return $ nodes) --(return $ YamlMap Nothing [(YamlStr "<ref>", nodes)])) -- XXX 76 (return $ case v' of 77 VObject _ -> nodes 78 _ -> YamlMap Nothing [(YamlStr "<ref>", nodes)] -- XXX 79 )))) 73 80 toYaml (d+1) (VList nodes) = do 74 81 trace ("toYaml VList: " ++ (show nodes)) $ return () 75 82 fmap YamlSeq $ mapM (toYaml d) nodes 83 toYaml (d+1) v@(VObject obj) = do 84 -- ... dump the objAttrs 85 -- XXX this needs fixing WRT demagicalized pairs: 86 -- currently, this'll return Foo.new((attr => "value)), with the inner 87 -- parens, which is, of course, wrong. 88 hash <- fromVal v :: Eval VHash 89 attrs <- toYaml d (VRef (hashRef hash)) 90 return $ addTag (Just $ "!pugs:object/" ++ showType (objType obj)) attrs 91 where 92 addTag _ (YamlMap (Just x) _) = error ("can't add tag: already tagged with" ++ x) 93 addTag tag (YamlMap _ m) = YamlMap tag m 76 94 toYaml _ v = return $ YamlStr $ encodeUTF8 $ pretty v 77 95
