/*
 * Copyright (c) 2004 Your Corporation. All Rights Reserved.
 */
package org.skife.futures;

public class LazyEvaluator implements Evaluator
{
    public Future promise(final Expression exp)
    {
        return new Future()
        {

            private Object result = null;
            private volatile Object mutex = new Object();

            public boolean isAvailable()
            {
                return true;
            }

            public Object getResult() throws Exception
            {
                if (result == null)
                {
                    synchronized (mutex)
                    {
                        if (result == null)
                        {
                            result = exp.evaluate();
                        }
                    }
                }
                return result;
            }
        };
    }
}
