/*******************************************************************************
 *  Copyright 2012-2018 Amazon.com, Inc. or its affiliates. All Rights Reserved.
 *  Licensed under the Apache License, Version 2.0 (the "License"). You may not use
 *  this file except in compliance with the License. A copy of the License is located at
 *
 *  http://aws.amazon.com/apache2.0
 *
 *  or in the "license" file accompanying this file.
 *  This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
 *  CONDITIONS OF ANY KIND, either express or implied. See the License for the
 *  specific language governing permissions and limitations under the License.
 * *****************************************************************************
 *
 *  AWS Tools for Windows (TM) PowerShell (TM)
 *
 */

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Amazon.PowerShell.Utils
{
    public class Lazy2<T>
    {
        private bool isThreadSafe = false;
        private bool isValueCreated = false;
        private T value;
        private Func<T> generator;

        public Lazy2(T value)
            : this(() => value) { }
        public Lazy2(Func<T> generator)
            : this(generator, false) { }
        private Lazy2(Func<T> generator, bool isThreadSafe)
        {
            this.generator = generator;
            this.isThreadSafe = isThreadSafe;
        }

        public bool IsValueCreated { get { return isValueCreated; } }
        public T Value
        {
            get
            {
                if (!isValueCreated)
                {
                    value = generator();
                    isValueCreated = true;
                }
                return value;
            }
        }
        public void Reset()
        {
            isValueCreated = false;
        }
    }

    public static class Lazy2Extensions
    {
        public static void SafeReset<T>(this Lazy2<T> self)
        {
            if (self != null)
                self.Reset();
        }
    }
}