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


-- | Please see the README on Github at
--   <a>https://github.com/githubuser/timemap#readme</a>
@package timemap
@version 0.0.7

module Data.TimeMap.Internal
type MultiMap k a = Map k (HashSet a)
empty :: MultiMap k a
insert :: (Ord k, Hashable a, Eq a) => k -> a -> MultiMap k a -> MultiMap k a
lookup :: (Ord k) => k -> MultiMap k a -> HashSet a

-- | Deletes all elements at <tt>k</tt>
delete :: (Ord k) => k -> MultiMap k a -> MultiMap k a

-- | Deletes only the element <tt>a</tt> from the referenced key <tt>k</tt>
remove :: (Ord k, Hashable a, Eq a) => k -> a -> MultiMap k a -> MultiMap k a
elems :: (Hashable a, Eq a) => MultiMap k a -> HashSet a
toList :: (Hashable a, Eq a) => MultiMap k a -> [(k, a)]


-- | A time-indexed mutable map for hashable keys.
--   
--   The goal of this map is to provide moderately fast lookups and
--   insertions for key/value pairs, while implicitly keeping track of the
--   last modification time of each entity. The auxilliary time data is
--   used for <a>filterSince</a> and <a>filterFromNow</a>, which quickly
--   prune the data set to get rid of old entities.
module Data.TimeMap

-- | A mutable reference for a time-indexed map, similar to a <a>STRef</a>.
data TimeMap k a

-- | Create a fresh, empty map.
newTimeMap :: STM (TimeMap k a)

-- | Inserts a key and value into a <a>TimeMap</a> - it adds the value or
--   overwites an existing entity.
insert :: Hashable k => Eq k => k -> a -> TimeMap k a -> IO ()
insertWithTime :: forall k a. Hashable k => Eq k => UTCTime -> k -> a -> TimeMap k a -> STM ()

-- | Updates or deletes the value at <tt>k</tt>, while updating its time.
update :: Hashable k => Eq k => (a -> Maybe a) -> k -> TimeMap k a -> IO ()
updateWithTime :: forall k a. Hashable k => Eq k => UTCTime -> (a -> Maybe a) -> k -> TimeMap k a -> STM ()

-- | Adjusts the value at <tt>k</tt>, while updating its time.
adjust :: Hashable k => Eq k => (a -> a) -> k -> TimeMap k a -> IO ()
adjustWithTime :: forall k a. Hashable k => Eq k => UTCTime -> (a -> a) -> k -> TimeMap k a -> STM ()

-- | Deletes the value at <tt>k</tt>.
delete :: Hashable k => Eq k => k -> TimeMap k a -> STM ()

-- | Resets the key to the current time, and fails silently when the key
--   isn't present.
touch :: Hashable k => Eq k => k -> TimeMap k a -> IO ()

-- | Performs a non-mutating lookup for some key.
lookup :: Hashable k => Eq k => k -> TimeMap k a -> STM (Maybe a)
timeOf :: Hashable k => Eq k => k -> TimeMap k a -> STM (Maybe UTCTime)
ageOf :: Hashable k => Eq k => k -> TimeMap k a -> IO (Maybe NominalDiffTime)
keys :: Hashable k => Eq k => TimeMap k a -> STM (HashSet k)
elems :: TimeMap k a -> STM [a]
toList :: Hashable k => Eq k => TimeMap k a -> STM [(k, a)]
size :: TimeMap k a -> STM Int
null :: TimeMap k a -> STM Bool
filter :: Hashable k => Eq k => (a -> Bool) -> TimeMap k a -> STM ()
filterWithKey :: forall k a. Hashable k => Eq k => (k -> a -> Bool) -> TimeMap k a -> STM ()

-- | Filters out all entries older than or equal to a designated time
filterSince :: Hashable k => Eq k => UTCTime -> TimeMap k a -> STM ()

-- | Filters out all entries within some time frame
--   
--   <pre>
--   filterFromNow 1 -- removes entities older than or equal to one second from now
--   </pre>
filterFromNow :: Hashable k => Eq k => NominalDiffTime -> TimeMap k a -> IO ()
takeSince :: Hashable k => Eq k => UTCTime -> TimeMap k a -> STM [(k, a)]
takeFromNow :: Hashable k => Eq k => NominalDiffTime -> TimeMap k a -> IO [(k, a)]

module Data.TimeSet
newtype TimeSet a
TimeSet :: TimeMap a () -> TimeSet a
[getTimeSet] :: TimeSet a -> TimeMap a ()
newTimeSet :: STM (TimeSet a)
insert :: (Hashable a, Eq a) => a -> TimeSet a -> IO ()
insertWithTime :: (Hashable a, Eq a) => UTCTime -> a -> TimeSet a -> STM ()
elem :: (Hashable a, Eq a) => a -> TimeSet a -> STM Bool
elems :: (Hashable a, Eq a) => TimeSet a -> STM (HashSet a)
size :: TimeSet a -> STM Int
null :: TimeSet a -> STM Bool
timeOf :: (Hashable a, Eq a) => a -> TimeSet a -> STM (Maybe UTCTime)
ageOf :: (Hashable a, Eq a) => a -> TimeSet a -> IO (Maybe NominalDiffTime)
delete :: (Hashable a, Eq a) => a -> TimeSet a -> STM ()
touch :: (Hashable a, Eq a) => a -> TimeSet a -> IO ()
filter :: (Hashable a, Eq a) => (a -> Bool) -> TimeSet a -> STM ()
takeSince :: (Hashable a, Eq a) => UTCTime -> TimeSet a -> STM [a]
filterSince :: (Hashable a, Eq a) => UTCTime -> TimeSet a -> STM ()
takeFromNow :: (Hashable a, Eq a) => NominalDiffTime -> TimeSet a -> IO [a]
filterFromNow :: (Hashable a, Eq a) => NominalDiffTime -> TimeSet a -> IO ()

module Data.TimeMap.Multi
newtype TimeMultiMap k a
TimeMultiMap :: TimeSet (k, a) -> TimeMultiMap k a
[getTimeMultiMap] :: TimeMultiMap k a -> TimeSet (k, a)
newTimeMultiMap :: STM (TimeMultiMap k a)
insert :: (Hashable k, Hashable a, Eq k, Eq a) => k -> a -> TimeMultiMap k a -> IO ()
insertWithTime :: (Hashable k, Hashable a, Eq k, Eq a) => UTCTime -> k -> a -> TimeMultiMap k a -> STM ()
elem :: (Hashable k, Hashable a, Eq k, Eq a) => k -> a -> TimeMultiMap k a -> STM Bool
keys :: (Hashable k, Hashable a, Eq k, Eq a) => TimeMultiMap k a -> STM [k]
elems :: (Hashable k, Hashable a, Eq k, Eq a) => TimeMultiMap k a -> STM [a]
size :: TimeMultiMap k a -> STM Int
null :: TimeMultiMap k a -> STM Bool
timeOf :: (Hashable k, Hashable a, Eq k, Eq a) => k -> a -> TimeMultiMap k a -> STM (Maybe UTCTime)
ageOf :: (Hashable k, Hashable a, Eq k, Eq a) => k -> a -> TimeMultiMap k a -> IO (Maybe NominalDiffTime)
delete :: (Hashable k, Hashable a, Eq k, Eq a) => k -> a -> TimeMultiMap k a -> STM ()
deleteAll :: (Hashable k, Hashable a, Eq k, Eq a) => k -> TimeMultiMap k a -> STM ()
touch :: (Hashable k, Hashable a, Eq k, Eq a) => k -> a -> TimeMultiMap k a -> IO ()
filter :: (Hashable k, Hashable a, Eq k, Eq a) => (k -> a -> Bool) -> TimeMultiMap k a -> STM ()
takeSince :: (Hashable k, Hashable a, Eq k, Eq a) => UTCTime -> TimeMultiMap k a -> STM [(k, a)]
filterSince :: (Hashable k, Hashable a, Eq k, Eq a) => UTCTime -> TimeMultiMap k a -> STM ()
takeFromNow :: (Hashable k, Hashable a, Eq k, Eq a) => NominalDiffTime -> TimeMultiMap k a -> IO [(k, a)]
filterFromNow :: (Hashable k, Hashable a, Eq k, Eq a) => NominalDiffTime -> TimeMultiMap k a -> IO ()
