Show
Ignore:
Timestamp:
03/04/07 14:41:52 (21 months ago)
Author:
audreyt
Message:

* Pugs.Prim.Keyed: Use gaal++'s fixpoint trick to refactor

the fallthrough case; also work with the new VV.

Files:
1 modified

Legend:

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

    r13925 r15440  
    99  existsFromRef, deleteFromRef, 
    1010) where 
    11 import Pugs.Internals (forM, genericLength) 
     11import Pugs.Internals (forM, genericLength, fix) 
    1212import Pugs.AST 
    1313import Pugs.Types 
     
    2323    return $ map (VRef . MkRef . IPair) (keys `zip` elems) 
    2424pairsFromVal (VRef ref) = pairsFromRef ref 
    25 pairsFromVal v = retError "Not a keyed reference" v 
     25pairsFromVal v = fix err v 
     26 
     27err :: (Val -> Eval b) -> Val -> Eval b 
     28err f v@(VV vv) = do 
     29    val <- vvToVal vv 
     30    case val of 
     31        VV{} -> retError "Not a keyed object" v 
     32        _    -> f val 
     33err f v = retError "Not a keyed value" v 
    2634 
    2735keysFromVal :: Val -> Eval Val 
     
    3442    vals <- keysFromRef ref 
    3543    return $ VList vals 
    36 keysFromVal v = retError "Not a keyed reference" v 
     44keysFromVal v = fix err v 
    3745 
    3846valuesFromVal :: Val -> Eval Val 
     
    4654    pairs <- hash_fetch sv 
    4755    return . VList $ Map.elems pairs 
    48 valuesFromVal v = retError "Not a keyed reference" v 
     56valuesFromVal v = fix err v 
    4957 
    5058-- XXX These bulks of code below screams for refactoring