Show
Ignore:
Timestamp:
03/05/07 11:47:16 (21 months ago)
Author:
audreyt
Message:

* Pugs.Prim.Keyed: Finally got the fixpoint trick right this time.

Files:
1 modified

Legend:

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

    r15450 r15460  
    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 = err pairsFromVal v 
     25pairsFromVal v = fallback v 
    2626 
    27 err :: (Val -> Eval b) -> Val -> Eval b 
    28 err f v@(VV vv) = do 
    29     val <- vvToVal vv 
    30     case val of 
    31         VV{} -> retError "Not a keyed object" v 
    32         _    -> f val 
    33 err _ v = retError "Not a keyed value" v 
     27fallback :: Val -> Eval b 
     28fallback = fix err 
     29    where 
     30    err :: (Val -> Eval b) -> Val -> Eval b 
     31    err f v@(VV vv) = do 
     32        val <- vvToVal vv 
     33        case val of 
     34            VV{} -> retError "Not a keyed object" v 
     35            _    -> f val 
     36    err _ v = retError "Not a keyed value" v 
    3437 
    3538keysFromVal :: Val -> Eval Val 
     
    4245    vals <- keysFromRef ref 
    4346    return $ VList vals 
    44 keysFromVal v = err keysFromVal v 
     47keysFromVal v = fallback v 
    4548 
    4649valuesFromVal :: Val -> Eval Val 
     
    5457    pairs <- hash_fetch sv 
    5558    return . VList $ Map.elems pairs 
    56 valuesFromVal v = err valuesFromVal v 
     59valuesFromVal v = fallback v 
    5760 
    5861-- XXX These bulks of code below screams for refactoring