module DataFrame.Typed.Util (
    camelToSnake,
) where

import Data.Char (isUpper, toLower)

{- | Convert a camelCase identifier to snake_case.

>>> camelToSnake "orderId"
"order_id"
>>> camelToSnake "amountUS"
"amount_u_s"
>>> camelToSnake "region"
"region"
-}
camelToSnake :: String -> String
camelToSnake :: String -> String
camelToSnake [] = []
camelToSnake (Char
c : String
cs) = Char -> Char
toLower Char
c Char -> String -> String
forall a. a -> [a] -> [a]
: String -> String
go String
cs
  where
    go :: String -> String
go [] = []
    go (Char
x : String
xs)
        | Char -> Bool
isUpper Char
x = Char
'_' Char -> String -> String
forall a. a -> [a] -> [a]
: Char -> Char
toLower Char
x Char -> String -> String
forall a. a -> [a] -> [a]
: String -> String
go String
xs
        | Bool
otherwise = Char
x Char -> String -> String
forall a. a -> [a] -> [a]
: String -> String
go String
xs