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

    import Lens.Micro ((&), (%~))
    #if !(MIN_VERSION_base(4,11,0))
    import Data.Monoid ((<>))
    #endif
    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 :: a -> a -> a -> a
    clamp mn :: a
    mn mx :: a
    mx val :: a
    val = a -> a -> a
    forall a. Ord a => a -> a -> a
    max a
    mn (a -> a -> a
    forall a. Ord a => a -> a -> a
    min a
    val a
    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 :: Color -> Color -> Attr
    on f :: Color
    f b :: Color
    b = Attr
    defAttr Attr -> Color -> Attr
    `withForeColor` Color
    f
                     Attr -> Color -> Attr
    `withBackColor` Color
    b

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

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

    -- | Add a 'Location' offset to the specified 'CursorLocation'.
    clOffset :: CursorLocation n -> Location -> CursorLocation n
    clOffset :: CursorLocation n -> Location -> CursorLocation n
    clOffset cl :: CursorLocation n
    cl off :: Location
    off = CursorLocation n
    cl CursorLocation n
    -> (CursorLocation n -> CursorLocation n) -> CursorLocation n
    forall a b. a -> (a -> b) -> b
    & (Location -> Identity Location)
    -> CursorLocation n -> Identity (CursorLocation n)
    forall n. Lens' (CursorLocation n) Location
    cursorLocationL ((Location -> Identity Location)
     -> CursorLocation n -> Identity (CursorLocation n))
    -> (Location -> Location) -> CursorLocation n -> CursorLocation n
    forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
    %~ (Location -> Location -> Location
    forall a. Semigroup a => a -> a -> a
    <> Location
    off)