    -- | Utility functions.
    module Brick.Util
      ( clamp
      , on
      , fg
      , bg
      , clOffset
      )
    where

    import Lens.Micro ((&), (%~))
    import Data.Monoid ((<>))
    import Graphics.Vty

    import Brick.Types.Internal (Location(..), CursorLocation(..), cursorLocationL)

    -- | Given a minimum value and a maximum value, clamp a value to that
    -- range (values less than the minimum map to the minimum and values
    -- greater than the maximum map to the maximum).
    --
    -- >>> clamp 1 10 11
    -- 10
    -- >>> clamp 1 10 2
    -- 2
    -- >>> clamp 5 10 1
    -- 5
    clamp :: (Ord a)
          => a
          -- ^ The minimum value
          -> a
          -- ^ The maximum value
          -> a
          -- ^ The value to clamp
          -> a
    clamp mn mx val = max mn (min val mx)

    -- | Build an attribute from a foreground color and a background color.
    -- Intended to be used infix.
    on :: Color
       -- ^ The foreground color
       -> Color
       -- ^ The background color
       -> Attr
    on f b = defAttr `withForeColor` f
                     `withBackColor` b

    -- | Create an attribute from the specified foreground color (the
    -- background color is the "default").
    fg :: Color -> Attr
    fg = (defAttr `withForeColor`)

    -- | Create an attribute from the specified background color (the
    -- background color is the "default").
    bg :: Color -> Attr
    bg = (defAttr `withBackColor`)

    -- | Add a 'Location' offset to the specified 'CursorLocation'.
    clOffset :: CursorLocation n -> Location -> CursorLocation n
    clOffset cl off = cl & cursorLocationL %~ (<> off)