    -- Copyright 2009 Corey O'Connor
    {-# OPTIONS_GHC -D_XOPEN_SOURCE #-}
    {-# LANGUAGE ForeignFunctionInterface #-}
    module Graphics.Text.Width
      ( wcwidth
      , wcswidth
      , safeWcwidth
      , safeWcswidth
      )
    where

    foreign import ccall unsafe "vty_mk_wcwidth" wcwidth :: Char -> Int

    wcswidth :: String -> Int
    wcswidth = sum . map wcwidth

    -- XXX: Characters with unknown widths occupy 1 column?
    --
    -- Not sure if this is actually correct. I presume there is a
    -- replacement character that is output by the terminal instead of the
    -- character and this replacement character is 1 column wide. If this is
    -- not true for all terminals then a per-terminal replacement character
    -- width needs to be implemented.

    -- | Returns the display width of a character. Assumes all characters
    -- with unknown widths are 0 width.
    safeWcwidth :: Char -> Int
    safeWcwidth = max 0 . wcwidth

    -- | Returns the display width of a string. Assumes all characters with
    -- unknown widths are 0 width.
    safeWcswidth :: String -> Int
    safeWcswidth = sum . map safeWcwidth