-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/


-- | memoization for IO actions and functions
--   
--   Package provides single polymorphic function <a>once</a>, that allows
--   you to memoize IO actions and functions, evaluating them at most once.
--   
--   <pre>
--   &gt;&gt;&gt; let mkStamp = (putStrLn "stamping" &gt;&gt; writeFile "/tmp/stamp" "") :: IO ()
--   
--   &gt;&gt;&gt; -- onceStamp :: IO ()
--   
--   &gt;&gt;&gt; onceStamp &lt;- once mkStamp
--   
--   &gt;&gt;&gt; -- onceStamp actually evaluates mkStamp it wraps first time.
--   
--   &gt;&gt;&gt; onceStamp
--   stamping
--   
--   &gt;&gt;&gt; -- but second time result `()' is memoized, no action is performed.
--   
--   &gt;&gt;&gt; onceStamp
--   
--   &gt;&gt;&gt; -- we can memoize functions too
--   
--   &gt;&gt;&gt; foo &lt;- once $ \x -&gt; print "foo" &gt;&gt; print (x :: Int)
--   
--   &gt;&gt;&gt; -- action will be performed once for every distinct argument
--   
--   &gt;&gt;&gt; foo 10
--   foo
--   10
--   
--   &gt;&gt;&gt; foo 10
--   10
--   
--   &gt;&gt;&gt; foo 4
--   foo
--   4
--   </pre>
@package once
@version 0.4


-- | This module expors single polymorphic function <a>once</a>, that
--   allows you to memoize IO actions and functions, evaluating them at
--   most once. Here is example:
--   
--   <pre>
--   &gt;&gt;&gt; let mkStamp = (putStrLn "stamping" &gt;&gt; writeFile "/tmp/stamp" "") :: IO ()
--   
--   &gt;&gt;&gt; -- onceStamp :: IO ()
--   
--   &gt;&gt;&gt; onceStamp &lt;- once mkStamp
--   
--   &gt;&gt;&gt; -- onceStamp actually evaluates mkStamp it wraps first time.
--   
--   &gt;&gt;&gt; onceStamp
--   stamping
--   
--   &gt;&gt;&gt; -- but second time result `()' is memoized, no action is performed.
--   
--   &gt;&gt;&gt; onceStamp
--   
--   &gt;&gt;&gt; -- we can memoize functions too
--   
--   &gt;&gt;&gt; foo &lt;- once $ \x -&gt; print "foo" &gt;&gt; print (x :: Int)
--   
--   &gt;&gt;&gt; -- action will be performed once for every distinct argument
--   
--   &gt;&gt;&gt; foo 10
--   foo
--   10
--   
--   &gt;&gt;&gt; foo 10
--   10
--   
--   &gt;&gt;&gt; foo 4
--   foo
--   4
--   </pre>
module Control.Once

-- | memoize IO action or function returning IO to be peformed only once.
--   
--   Any <a>IO</a> action is suitable, as is any function with
--   <tt>Hashable</tt> arguments, returning value in IO monad. Value of any
--   of type below are okay to pass to <a>once</a>:
--   
--   <pre>
--   IO Int
--   Int -&gt; IO ()
--   Int -&gt; Double -&gt; IO (Char -&gt; Int)
--   </pre>
--   
--   Due implementation limitations, only up to 7 arguments are supported.
once :: Once a => a -> IO a
instance (GHC.Classes.Eq a, Data.Hashable.Class.Hashable a) => Control.Once.Class.Once (a -> GHC.Types.IO r)
instance (GHC.Classes.Eq a1, GHC.Classes.Eq a2, Data.Hashable.Class.Hashable a1, Data.Hashable.Class.Hashable a2) => Control.Once.Class.Once (a2 -> a1 -> GHC.Types.IO r)
instance (GHC.Classes.Eq a1, GHC.Classes.Eq a2, GHC.Classes.Eq a3, Data.Hashable.Class.Hashable a1, Data.Hashable.Class.Hashable a2, Data.Hashable.Class.Hashable a3) => Control.Once.Class.Once (a3 -> a2 -> a1 -> GHC.Types.IO r)
instance (GHC.Classes.Eq a1, GHC.Classes.Eq a2, GHC.Classes.Eq a3, GHC.Classes.Eq a4, Data.Hashable.Class.Hashable a1, Data.Hashable.Class.Hashable a2, Data.Hashable.Class.Hashable a3, Data.Hashable.Class.Hashable a4) => Control.Once.Class.Once (a4 -> a3 -> a2 -> a1 -> GHC.Types.IO r)
instance (GHC.Classes.Eq a1, GHC.Classes.Eq a2, GHC.Classes.Eq a3, GHC.Classes.Eq a4, GHC.Classes.Eq a5, Data.Hashable.Class.Hashable a1, Data.Hashable.Class.Hashable a2, Data.Hashable.Class.Hashable a3, Data.Hashable.Class.Hashable a4, Data.Hashable.Class.Hashable a5) => Control.Once.Class.Once (a5 -> a4 -> a3 -> a2 -> a1 -> GHC.Types.IO r)
instance (GHC.Classes.Eq a1, GHC.Classes.Eq a2, GHC.Classes.Eq a3, GHC.Classes.Eq a4, GHC.Classes.Eq a5, GHC.Classes.Eq a6, Data.Hashable.Class.Hashable a1, Data.Hashable.Class.Hashable a2, Data.Hashable.Class.Hashable a3, Data.Hashable.Class.Hashable a4, Data.Hashable.Class.Hashable a5, Data.Hashable.Class.Hashable a6) => Control.Once.Class.Once (a6 -> a5 -> a4 -> a3 -> a2 -> a1 -> GHC.Types.IO r)
instance (GHC.Classes.Eq a1, GHC.Classes.Eq a2, GHC.Classes.Eq a3, GHC.Classes.Eq a4, GHC.Classes.Eq a5, GHC.Classes.Eq a6, GHC.Classes.Eq a7, Data.Hashable.Class.Hashable a1, Data.Hashable.Class.Hashable a2, Data.Hashable.Class.Hashable a3, Data.Hashable.Class.Hashable a4, Data.Hashable.Class.Hashable a5, Data.Hashable.Class.Hashable a6, Data.Hashable.Class.Hashable a7) => Control.Once.Class.Once (a7 -> a6 -> a5 -> a4 -> a3 -> a2 -> a1 -> GHC.Types.IO r)
instance Control.Once.Class.Once (GHC.Types.IO a)
