    {-# LINE 1 "Data/Text/ICU/Locale.hsc" #-}
    {-# LANGUAGE RankNTypes, BangPatterns, ForeignFunctionInterface, RecordWildCards #-}
    -- |
    -- Module      : Data.Text.ICU.Locale
    -- Copyright   : (c) 2021 Torsten Kemps-Benedix
    --
    -- License     : BSD-style
    -- Maintainer  : bos@serpentine.com
    -- Stability   : experimental
    -- Portability : GHC
    --
    -- Locale functions implemented as bindings to
    -- the International Components for Unicode (ICU) libraries.

    module Data.Text.ICU.Locale
        (availableLocales
        ) where

    import Control.Monad (forM)
    import Data.Int (Int32)
    import Foreign.C.String (CString, peekCString)
    import Prelude hiding (last)

    -- |  Get the available default locales, i.e. locales that return data when passed to ICU
    -- APIs, but not including legacy or alias locales.
    availableLocales :: IO [String]
    availableLocales :: IO [String]
    availableLocales = do
      n <- IO Int32
    uloc_countAvailable
      forM [0..n-1] $ \Int32
    i -> Int32 -> IO CString
    uloc_getAvailable Int32
    i IO CString -> (CString -> IO String) -> IO String
    forall a b. IO a -> (a -> IO b) -> IO b
    forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
    >>= CString -> IO String
    peekCString

    foreign import ccall unsafe "hs_text_icu.h __hs_uloc_getAvailable" uloc_getAvailable
        :: Int32 -> IO CString
    foreign import ccall unsafe "hs_text_icu.h __hs_uloc_countAvailable" uloc_countAvailable
        :: IO Int32