{- |
Module      : Web.RBB.Util
Description :  Globally used utility functions
Copyright   :  (c) Sebastian Witte
License     :  BSD3

Maintainer  :  woozletoff@gmail.com
Stability   :  experimental

-}
module Web.RBB.Util
    ( module ReExport
    , ixSetModifyIx
    ) where

import           Control.Applicative as ReExport
import           Control.Lens        as ReExport
import           Control.Monad       as ReExport
import           Control.Monad.Base  as ReExport (MonadBase)
import           Data.Data           as ReExport (Typeable)
import           Data.Function       as ReExport (on)
import           Data.IxSet
import           Data.IxSet          as ReExport (IxSet)
import qualified Data.IxSet          as IxSet
import           Data.Maybe          as ReExport
import           Data.Monoid         as ReExport
import           Data.Text           as ReExport (Text, pack)
import           Data.Time           as ReExport (UTCTime)
import           Text.Blaze.Html5    as ReExport (Html)

-- | Modify the unique value indexable by @k@. If there ir no value or if there
-- are multiple values for the given index, the 'IxSet' is unmodified.
ixSetModifyIx :: (Ord a, Typeable a, IxSet.Indexable a, Typeable k)
              => k -> (a -> a) -> IxSet a -> IxSet a
ixSetModifyIx k f is = case getOne $ is @= k of
    Nothing -> is
    Just a  -> insert (f a) $ delete a is