modulo-1.1: src/Language/Modulo/Util/Unmangle.hs
{-# LANGUAGE DisambiguateRecordFields, TypeFamilies,
StandaloneDeriving, DeriveFunctor, DeriveFoldable, GeneralizedNewtypeDeriving #-}
-------------------------------------------------------------------------------------
-- |
-- Copyright : (c) Hans Hoglund 2012
-- License : BSD-style
-- Maintainer : hans@hanshoglund.se
-- Stability : experimental
-- Portability : GHC
--
-- Unmanglers for various kinds of identifiers.
--
-------------------------------------------------------------------------------------
module Language.Modulo.Util.Unmangle (
unmangle,
uncase,
unsep
) where
import Data.Semigroup
import Data.Semigroup
import Language.Modulo.Util
import qualified Data.Char as Char
import qualified Data.List as List
-- |
-- Unmangle an indentifier in mixed or separarated case.
unmangle :: String -> [String]
unmangle "" = []
unmangle a = mconcat . fmap uncase $ unsep a
-- |
-- Unmangle an indentifier in mixed case, i.e. @fooBar@ becomes @[foo, bar]@.
uncase :: String -> [String]
uncase "" = []
uncase (c:cs) = case n of
Nothing -> [c:cs]
Just n -> (c : take n cs) : uncase (drop n cs)
where
n = List.findIndex (Char.isUpper) cs
-- |
-- Unmangle an indentifier using the underscore as separator, i.e. @foo_bar@ becomes @[foo, bar]@.
--
-- > unsep (sep a) = a, iff a /= []
--
unsep :: String -> [String]
unsep [] = []
unsep cs = unsep' cs
unsep' cs = case n of
Nothing -> [cs]
Just n -> take n cs : unsep' (drop (n+1) cs)
where
n = List.findIndex isSep cs
isSep '_' = True
isSep _ = False