Take the 2-minute tour ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

Sometimes it can come in handy to set a lower limit for a calculation. Consider for example an animation that is generated by some infinite loop, which would run way too fast to display properly for the user. For this reason, I need a function of the type "pause at least". It would be like a little brother of TimeConstrained.

I threw together the following small code which seems to do the trick, but I'm wondering whether there is a more efficient or elegant solution for this?

Here's my version if you're interested, it's pretty straightforward:

pauseAtLeast[calculation_, pause_] :=
    Block[{start, result},
        start = AbsoluteTime[];
        result = calculation;
        If[AbsoluteTime[] < start + pause,
            Pause[start + pause - AbsoluteTime[]]
        ];
        result
    ]
SetAttributes[pauseAtLeast, HoldFirst];

Usage:

(* Pauses 2 seconds *)
AbsoluteTiming@pauseAtLeast[Pause[2], 1]
(* Pauses 1 second *)
AbsoluteTiming@pauseAtLeast[Pause[.5], 1]
share|improve this question
    
David, I notice that you have Accepted answers to nearly all of your questions, but not this one. An oversight, or was it never answered to your satisfaction? –  Mr.Wizard Apr 24 '13 at 11:11
1  
@Mr.Wizard The answers provided don't really add anything to my naive implementation. When I asked this, I wondered whether maybe there's a built-in function to handle this (plus all possible special cases I could think of). –  David Apr 24 '13 at 14:52
    
I see. Thanks for the clarification. –  Mr.Wizard Apr 25 '13 at 1:16

2 Answers 2

A similar but slightly shorter solution...

SetAttributes[pauseAtLeast2, HoldFirst]; 

pauseAtLeast2[calculation_, pause_] := 
   With[{res = AbsoluteTiming[calculation]},
        If[res[[1]] < pause, 
               Pause[pause - res[[1]]]
        ]; 

        res[[2]]
   ]
share|improve this answer

Same as Andy but in terse style:

SetAttributes[holdFor, HoldFirst];

holdFor[op_, hold_] :=
  (Pause[# UnitStep@#] &[hold - #]; #2) & @@ AbsoluteTiming @ op
share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.