Hello community,

here is the log from the commit of package ghc-auto-update for openSUSE:Factory 
checked in at 2016-04-30 23:30:10
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/ghc-auto-update (Old)
 and      /work/SRC/openSUSE:Factory/.ghc-auto-update.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "ghc-auto-update"

Changes:
--------
--- /work/SRC/openSUSE:Factory/ghc-auto-update/ghc-auto-update.changes  
2016-01-07 00:25:28.000000000 +0100
+++ /work/SRC/openSUSE:Factory/.ghc-auto-update.new/ghc-auto-update.changes     
2016-04-30 23:30:12.000000000 +0200
@@ -1,0 +2,6 @@
+Tue Apr 26 08:09:36 UTC 2016 - [email protected]
+
+- update to 0.1.3.1
+* Doc improvements
+
+-------------------------------------------------------------------

Old:
----
  auto-update-0.1.3.tar.gz

New:
----
  auto-update-0.1.3.1.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ ghc-auto-update.spec ++++++
--- /var/tmp/diff_new_pack.azeNDe/_old  2016-04-30 23:30:12.000000000 +0200
+++ /var/tmp/diff_new_pack.azeNDe/_new  2016-04-30 23:30:12.000000000 +0200
@@ -19,7 +19,7 @@
 %global pkg_name auto-update
 
 Name:           ghc-auto-update
-Version:        0.1.3
+Version:        0.1.3.1
 Release:        0
 Summary:        Efficiently run periodic, on-demand actions
 License:        MIT

++++++ auto-update-0.1.3.tar.gz -> auto-update-0.1.3.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/auto-update-0.1.3/ChangeLog.md 
new/auto-update-0.1.3.1/ChangeLog.md
--- old/auto-update-0.1.3/ChangeLog.md  2015-12-16 07:13:54.000000000 +0100
+++ new/auto-update-0.1.3.1/ChangeLog.md        2016-04-25 15:26:28.000000000 
+0200
@@ -1,2 +1,11 @@
-__0.1.3__ Adding a new AIP - reaperKill
-__0.1.2__ Added Control.Debounce
+## 0.1.3.1
+
+* Doc improvements
+
+## 0.1.3
+
+* Adding a new AIP - reaperKill
+
+## 0.1.2
+
+* Added Control.Debounce
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/auto-update-0.1.3/Control/AutoUpdate.hs 
new/auto-update-0.1.3.1/Control/AutoUpdate.hs
--- old/auto-update-0.1.3/Control/AutoUpdate.hs 2015-12-16 07:13:54.000000000 
+0100
+++ new/auto-update-0.1.3.1/Control/AutoUpdate.hs       2016-04-24 
15:33:08.000000000 +0200
@@ -1,21 +1,40 @@
--- | A common problem is the desire to have an action run at a scheduled
--- interval, but only if it is needed. For example, instead of having
--- every web request result in a new @getCurrentTime@ call, we'd like to
--- have a single worker thread run every second, updating an @IORef@.
--- However, if the request frequency is less than once per second, this is
--- a pessimization, and worse, kills idle GC.
---
--- This library allows you to define actions which will either be
--- performed by a dedicated thread or, in times of low volume, will be
--- executed by the calling thread.
+-- | In a multithreaded environment, running actions on a regularly scheduled
+-- background thread can dramatically improve performance.
+-- For example, web servers need to return the current time with each HTTP 
response.
+-- For a high-volume server, it's much faster for a dedicated thread to run 
every
+-- second, and write the current time to a shared 'IORef', than it is for each
+-- request to make its own call to 'getCurrentTime'.
+--
+-- But for a low-volume server, whose request frequency is less than once per 
+-- second, that approach will result in /more/ calls to 'getCurrentTime' than 
+-- necessary, and worse, kills idle GC.
+--
+-- This library solves that problem by allowing you to define actions which 
will
+-- either be performed by a dedicated thread, or, in times of low volume, will 
+-- be executed by the calling thread.
+--
+-- Example usage:
+--
+-- @
+-- import "Data.Time"
+-- import "Control.AutoUpdate"
+--
+-- getTime <- 'mkAutoUpdate' 'defaultUpdateSettings'
+--              { 'updateAction' = 'Data.Time.Clock.getCurrentTime'
+--              , 'updateFreq' = 1000000 -- The default frequency, once per 
second
+--              }
+-- currentTime <- getTime
+-- @
+--
+-- For more examples, 
<http://www.yesodweb.com/blog/2014/08/announcing-auto-update see the blog post 
introducing this library>.
 module Control.AutoUpdate (
       -- * Type
       UpdateSettings
     , defaultUpdateSettings
       -- * Accessors
+    , updateAction
     , updateFreq
     , updateSpawnThreshold
-    , updateAction
       -- * Creation
     , mkAutoUpdate
     ) where
@@ -27,9 +46,9 @@
 import           Control.Monad           (void)
 import           Data.IORef              (newIORef, readIORef, writeIORef)
 
--- | Default value for creating an @UpdateSettings@.
+-- | Default value for creating an 'UpdateSettings'.
 --
--- Since 0.1.0
+-- @since 0.1.0
 defaultUpdateSettings :: UpdateSettings ()
 defaultUpdateSettings = UpdateSettings
     { updateFreq = 1000000
@@ -39,44 +58,44 @@
 
 -- | Settings to control how values are updated.
 --
--- This should be constructed using @defaultUpdateSettings@ and record
+-- This should be constructed using 'defaultUpdateSettings' and record
 -- update syntax, e.g.:
 --
 -- @
--- let set = defaultUpdateSettings { updateAction = getCurrentTime }
+-- let settings = 'defaultUpdateSettings' { 'updateAction' = 
'Data.Time.Clock.getCurrentTime' }
 -- @
 --
--- Since 0.1.0
+-- @since 0.1.0
 data UpdateSettings a = UpdateSettings
     { updateFreq           :: Int
     -- ^ Microseconds between update calls. Same considerations as
-    -- @threadDelay@ apply.
+    -- 'threadDelay' apply.
     --
     -- Default: 1 second (1000000)
     --
-    -- Since 0.1.0
+    -- @since 0.1.0
     , updateSpawnThreshold :: Int
     -- ^ NOTE: This value no longer has any effect, since worker threads are
     -- dedicated instead of spawned on demand.
     --
-    -- Previously, this determined: How many times the data must be requested
+    -- Previously, this determined how many times the data must be requested
     -- before we decide to spawn a dedicated thread.
     --
     -- Default: 3
     --
-    -- Since 0.1.0
+    -- @since 0.1.0
     , updateAction         :: IO a
     -- ^ Action to be performed to get the current value.
     --
     -- Default: does nothing.
     --
-    -- Since 0.1.0
+    -- @since 0.1.0
     }
 
 -- | Generate an action which will either read from an automatically
 -- updated value, or run the update action in the current thread.
 --
--- Since 0.1.0
+-- @since 0.1.0
 mkAutoUpdate :: UpdateSettings a -> IO (IO a)
 mkAutoUpdate us = do
     -- A baton to tell the worker thread to generate a new value.
@@ -158,7 +177,7 @@
             -- we have a current value, use it
             Right val -> return val
 
--- | Turn a runtime exception into an impure exception, so that all @IO@
+-- | Turn a runtime exception into an impure exception, so that all 'IO'
 -- actions will complete successfully. This simply defers the exception until
 -- the value is forced.
 catchSome :: IO a -> IO a
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/auto-update-0.1.3/Control/Debounce.hs 
new/auto-update-0.1.3.1/Control/Debounce.hs
--- old/auto-update-0.1.3/Control/Debounce.hs   2015-12-16 07:13:54.000000000 
+0100
+++ new/auto-update-0.1.3.1/Control/Debounce.hs 2016-04-24 15:33:08.000000000 
+0200
@@ -3,10 +3,26 @@
 -- period of time.
 --
 -- This is useful as an optimization, for example to ensure that logs are only
--- flushed to disk at most once per second. See the fast-logger package for an
--- example usage.
+-- flushed to disk at most once per second.
 --
--- Since 0.1.2
+-- Example usage:
+--
+-- @
+-- printString <- 'mkDebounce' 'defaultDebounceSettings'
+--                  { 'debounceAction' = putStrLn "Running action"
+--                  , 'debounceFreq' = 5000000 -- 5 seconds
+--                  }
+-- @
+--
+-- >>> printString
+-- Running action
+-- >>> printString
+-- <Wait five seconds>
+-- Running action
+--
+-- See the fast-logger package ("System.Log.FastLogger") for real-world usage.
+--
+-- @since 0.1.2
 module Control.Debounce
     ( -- * Type
       DebounceSettings
@@ -25,14 +41,14 @@
 
 -- | Settings to control how debouncing should work.
 --
--- This should be constructed using @defaultDebounceSettings@ and record
+-- This should be constructed using 'defaultDebounceSettings' and record
 -- update syntax, e.g.:
 --
 -- @
--- let set = defaultDebounceSettings { debounceAction = flushLog }
+-- let settings = 'defaultDebounceSettings' { 'debounceAction' = flushLog }
 -- @
 --
--- Since 0.1.2
+-- @since 0.1.2
 data DebounceSettings = DebounceSettings
     { debounceFreq   :: Int
     -- ^ Microseconds lag required between subsequence calls to the debounced
@@ -40,7 +56,7 @@
     --
     -- Default: 1 second (1000000)
     --
-    -- Since 0.1.2
+    -- @since 0.1.2
     , debounceAction :: IO ()
     -- ^ Action to be performed.
     --
@@ -48,12 +64,12 @@
     --
     -- Default: does nothing.
     --
-    -- Since 0.1.2
+    -- @since 0.1.2
     }
 
--- | Default value for creating a @DebounceSettings@.
+-- | Default value for creating a 'DebounceSettings'.
 --
--- Since 0.1.2
+-- @since 0.1.2
 defaultDebounceSettings :: DebounceSettings
 defaultDebounceSettings = DebounceSettings
     { debounceFreq = 1000000
@@ -64,7 +80,7 @@
 -- performed. The action will either be performed immediately, or after the
 -- current cooldown period has expired.
 --
--- Since 0.1.2
+-- @since 0.1.2
 mkDebounce :: DebounceSettings -> IO (IO ())
 mkDebounce (DebounceSettings freq action) = do
     baton <- newEmptyMVar
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/auto-update-0.1.3/Control/Reaper.hs 
new/auto-update-0.1.3.1/Control/Reaper.hs
--- old/auto-update-0.1.3/Control/Reaper.hs     2015-12-16 07:13:54.000000000 
+0100
+++ new/auto-update-0.1.3.1/Control/Reaper.hs   2016-04-25 15:20:34.000000000 
+0200
@@ -3,8 +3,18 @@
 
 -- | This module provides the ability to create reapers: dedicated cleanup
 -- threads. These threads will automatically spawn and die based on the
--- presence of a workload to process on.
+-- presence of a workload to process on. Example uses include:
+--
+-- * Killing long-running jobs 
+-- * Closing unused connections in a connection pool
+-- * Pruning a cache of old items (see example below)
+--
+-- For real-world usage, search the <https://github.com/yesodweb/wai WAI 
family of packages>
+-- for imports of "Control.Reaper".
 module Control.Reaper (
+      -- * Example: Regularly cleaning a cache
+      -- $example1
+
       -- * Settings
       ReaperSettings
     , defaultReaperSettings
@@ -33,7 +43,7 @@
 -- be a list of @item@s. This is encouraged by 'defaultReaperSettings' and
 -- 'mkListAction'.
 --
--- Since 0.1.1
+-- @since 0.1.1
 data ReaperSettings workload item = ReaperSettings
     { reaperAction :: workload -> IO (workload -> workload)
     -- ^ The action to perform on a workload. The result of this is a
@@ -46,38 +56,38 @@
     -- temporary workload. This is incredibly useless; you should
     -- definitely override this default.
     --
-    -- Since 0.1.1
+    -- @since 0.1.1
     , reaperDelay :: {-# UNPACK #-} !Int
     -- ^ Number of microseconds to delay between calls of 'reaperAction'.
     --
     -- Default: 30 seconds.
     --
-    -- Since 0.1.1
+    -- @since 0.1.1
     , reaperCons :: item -> workload -> workload
     -- ^ Add an item onto a workload.
     --
     -- Default: list consing.
     --
-    -- Since 0.1.1
+    -- @since 0.1.1
     , reaperNull :: workload -> Bool
     -- ^ Check if a workload is empty, in which case the worker thread
     -- will shut down.
     --
     -- Default: 'null'.
     --
-    -- Since 0.1.1
+    -- @since 0.1.1
     , reaperEmpty :: workload
     -- ^ An empty workload.
     --
     -- Default: empty list.
     --
-    -- Since 0.1.1
+    -- @since 0.1.1
     }
 
 -- | Default @ReaperSettings@ value, biased towards having a list of work
 -- items.
 --
--- Since 0.1.1
+-- @since 0.1.1
 defaultReaperSettings :: ReaperSettings [item] item
 defaultReaperSettings = ReaperSettings
     { reaperAction = \wl -> return (wl ++)
@@ -104,11 +114,11 @@
 data State workload = NoReaper           -- ^ No reaper thread
                     | Workload workload  -- ^ The current jobs
 
--- | Create a reaper addition function. This funciton can be used to add
+-- | Create a reaper addition function. This function can be used to add
 -- new items to the workload. Spawning of reaper threads will be handled
 -- for you automatically.
 --
--- Since 0.1.1
+-- @since 0.1.1
 mkReaper :: ReaperSettings workload item -> IO (Reaper workload item)
 mkReaper settings@ReaperSettings{..} = do
     stateRef <- newIORef NoReaper
@@ -187,7 +197,7 @@
 -- return either a new work item, or @Nothing@ if the work item is
 -- expired.
 --
--- Since 0.1.1
+-- @since 0.1.1
 mkListAction :: (item -> IO (Maybe item'))
              -> [item]
              -> IO ([item'] -> [item'])
@@ -202,3 +212,68 @@
                     Nothing -> front
                     Just y  -> front . (y:)
         go front' xs
+
+-- $example1
+-- In this example code, we use a 'Data.Map.Strict.Map' to cache fibonacci 
numbers, and a 'Reaper' to prune the cache. 
+--
+-- The @main@ function first creates a 'Reaper', with fields to initialize the 
+-- cache ('reaperEmpty'), add items to it ('reaperCons'), and prune it 
('reaperAction').
+-- The reaper will run every two seconds ('reaperDelay'), but will stop 
running while 
+-- 'reaperNull' is true.
+--
+-- @main@ then loops infinitely ('Control.Monad.forever'). Each second it 
calculates the fibonacci number 
+-- for a value between 30 and 34, first trying the cache ('reaperRead' and 
'Data.Map.Strict.lookup'), 
+-- then falling back to manually calculating it (@fib@) 
+-- and updating the cache with the result ('reaperAdd')
+--
+-- @clean@ simply removes items cached for more than 10 seconds.
+-- This function is where you would perform IO-related cleanup,
+-- like killing threads or closing connections, if that was the purpose of 
your reaper.
+--
+-- @
+-- module Main where
+--
+-- import "Data.Time" (UTCTime, getCurrentTime, diffUTCTime)
+-- import "Control.Reaper"
+-- import "Control.Concurrent" (threadDelay)
+-- import "Data.Map.Strict" (Map)
+-- import qualified "Data.Map.Strict" as Map
+-- import "Control.Monad" (forever)
+-- import "System.Random" (getStdRandom, randomR)
+--
+-- fib :: 'Int' -> 'Int'
+-- fib 0 = 0
+-- fib 1 = 1
+-- fib n = fib (n-1) + fib (n-2)
+--
+-- type Cache = 'Data.Map.Strict.Map' 'Int' ('Int', 'Data.Time.Clock.UTCTime')
+--
+-- main :: IO ()
+-- main = do
+--   reaper <- 'mkReaper' 'defaultReaperSettings'
+--     { 'reaperEmpty' = Map.'Data.Map.Strict.empty'
+--     , 'reaperCons' = \\(k, v, time) workload -> 
Map.'Data.Map.Strict.insert' k (v, time) workload
+--     , 'reaperAction' = clean
+--     , 'reaperDelay' = 1000000 * 2 -- Clean every 2 seconds
+--     , 'reaperNull' = Map.'Data.Map.Strict.null'
+--     }
+--   forever $ do
+--     fibArg <- 'System.Random.getStdRandom' ('System.Random.randomR' (30,34))
+--     cache <- 'reaperRead' reaper
+--     let cachedResult = Map.'Data.Map.Strict.lookup' fibArg cache
+--     case cachedResult of
+--       'Just' (fibResult, _createdAt) -> 'putStrLn' $ "Found in cache: `fib 
" ++ 'show' fibArg ++ "` " ++ 'show' fibResult
+--       'Nothing' -> do
+--         let fibResult = fib fibArg
+--         'putStrLn' $ "Calculating `fib " ++ 'show' fibArg ++ "` " ++ 'show' 
fibResult
+--         time <- 'Data.Time.Clock.getCurrentTime'
+--         ('reaperAdd' reaper) (fibArg, fibResult, time)
+--     'threadDelay' 1000000 -- 1 second
+--
+-- -- Remove items > 10 seconds old
+-- clean :: Cache -> IO (Cache -> Cache)
+-- clean oldMap = do
+--   currentTime <- 'Data.Time.Clock.getCurrentTime'
+--   let pruned = Map.'Data.Map.Strict.filter' (\\(_, createdAt) -> 
currentTime \`diffUTCTime\` createdAt < 10.0) oldMap
+--   return (\\newData -> Map.'Data.Map.Strict.union' pruned newData)
+-- @
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/auto-update-0.1.3/auto-update.cabal 
new/auto-update-0.1.3.1/auto-update.cabal
--- old/auto-update-0.1.3/auto-update.cabal     2015-12-16 07:13:54.000000000 
+0100
+++ new/auto-update-0.1.3.1/auto-update.cabal   2016-04-25 15:26:32.000000000 
+0200
@@ -1,5 +1,5 @@
 name:                auto-update
-version:             0.1.3
+version:             0.1.3.1
 synopsis:            Efficiently run periodic, on-demand actions
 description:         API docs and the README are available at 
<http://www.stackage.org/package/auto-update>.
 homepage:            https://github.com/yesodweb/wai


Reply via email to