content: {-# OPTIONS_JHC -fffi #-}
  module Data.Unicode(
      CType(),
      ctype,
      isCType,
      t_alnum,
      t_alpha,
      t_blank,
      t_cntrl,
      t_digit,
      t_graph,
      t_lower,
      t_print,
      t_punct,
      t_space,
      t_upper,
      t_xdigit,
      t_none
      )where
  
  import Foreign.C.String
  import Foreign.C.Types
  import System.IO.Unsafe
  
  newtype CType = CType CInt
  
  -- | Get a ctype other than one of the defaults.
  
  ctype :: String -> IO CType
  ctype s = withCString s c_wctype
  
  isCType :: Char -> CType -> Bool
  isCType ch ct = unsafePerformIO (c_iswctype ch ct) /= 0
  
  
  t_alnum, t_alpha, t_blank, t_cntrl,
   t_digit, t_graph, t_lower, t_print,
   t_punct, t_space, t_upper, t_xdigit, t_none :: CType
  
  t_alnum = unsafePerformIO (ctype "alnum")
  t_alpha = unsafePerformIO (ctype "alpha")
  t_blank = unsafePerformIO (ctype "blank")
  t_cntrl = unsafePerformIO (ctype "cntrl")
  t_digit = unsafePerformIO (ctype "digit")
  t_graph = unsafePerformIO (ctype "graph")
  t_lower = unsafePerformIO (ctype "lower")
  t_print = unsafePerformIO (ctype "print")
  t_punct = unsafePerformIO (ctype "punct")
  t_space = unsafePerformIO (ctype "space")
  t_upper = unsafePerformIO (ctype "upper")
  t_xdigit = unsafePerformIO (ctype "xdigit")
  t_none = CType 0
  
  {-# NOINLINE
   t_alnum, t_alpha, t_blank, t_cntrl,
   t_digit, t_graph, t_lower, t_print,
   t_punct, t_space, t_upper, t_xdigit
   #-}
  
  
  foreign import ccall "wctype.h iswctype" c_iswctype :: Char -> CType -> IO Int
  foreign import ccall "wctype.h wctype" c_wctype :: CString -> IO CType
  
  