{-# LANGUAGE ForeignFunctionInterface
#-}
module Data.Char.WCWidth
( wcwidth
, widths
, ranges
) where
import Foreign.C
import Data.List
widths :: [ (Char, Int) ]
widths :: [(Char, Int)]
widths = [ (Char
c, Char -> Int
wcwidth Char
c) | Char
c <- [forall a. Bounded a => a
minBound..forall a. Bounded a => a
maxBound] ]
ranges :: [ ((Char, Char), Int) ]
ranges :: [((Char, Char), Int)]
ranges = forall a. [a] -> [a]
reverse (forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' forall {a} {b}. Eq a => [((b, b), a)] -> (b, a) -> [((b, b), a)]
aggregate [((Char, Char), Int)]
start (forall a. [a] -> [a]
tail [(Char, Int)]
widths))
where
start :: [((Char, Char), Int)]
start = forall {a} {b}. Eq a => [((b, b), a)] -> (b, a) -> [((b, b), a)]
aggregate [] (forall a. [a] -> a
head [(Char, Int)]
widths)
aggregate :: [((b, b), a)] -> (b, a) -> [((b, b), a)]
aggregate [] (b
c, a
w) = [((b
c, b
c), a
w)]
aggregate (((b
a, b
z), a
i) : [((b, b), a)]
t) (b
c, a
w)
| a
i forall a. Eq a => a -> a -> Bool
== a
w = ((b
a, b
c), a
i) forall a. a -> [a] -> [a]
: [((b, b), a)]
t
| Bool
otherwise = ((b
c, b
c), a
w) forall a. a -> [a] -> [a]
: ((b
a, b
z), a
i) forall a. a -> [a] -> [a]
: [((b, b), a)]
t
wcwidth :: Char -> Int
wcwidth :: Char -> Int
wcwidth = forall a. Enum a => a -> Int
fromEnum forall b c a. (b -> c) -> (a -> b) -> a -> c
. CWchar -> CInt
native forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Enum a => Int -> a
toEnum forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Enum a => a -> Int
fromEnum
foreign import ccall unsafe "wchar.h wcwidth" native :: CWchar -> CInt