module Cfg.Env.Keys where

import Data.Text (Text)
import Data.Tree (Tree, foldTree)
import Cfg.Source (RootConfig (..))
import Data.List (intersperse)

-- | @since 0.0.1.0
getEnvKey :: Text -> [Text] -> Text
getEnvKey :: Text -> [Text] -> Text
getEnvKey Text
sep = (Text -> Text -> Text) -> Text -> [Text] -> Text
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr Text -> Text -> Text
forall a. Monoid a => a -> a -> a
mappend Text
"" ([Text] -> Text) -> ([Text] -> [Text]) -> [Text] -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> [Text] -> [Text]
forall a. a -> [a] -> [a]
intersperse Text
sep

-- | @since 0.0.1.0
getKeys :: Tree Text -> [[Text]]
getKeys :: Tree Text -> [[Text]]
getKeys = (Text -> [[[Text]]] -> [[Text]]) -> Tree Text -> [[Text]]
forall a b. (a -> [b] -> b) -> Tree a -> b
foldTree Text -> [[[Text]]] -> [[Text]]
f
 where
  f :: Text -> [[[Text]]] -> [[Text]]
  f :: Text -> [[[Text]]] -> [[Text]]
f Text
label [] = [[Text
label]]
  f Text
label [[[Text]]]
xs = [[[Text]]] -> [[Text]]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ([[[Text]]] -> [[Text]]) -> [[[Text]]] -> [[Text]]
forall a b. (a -> b) -> a -> b
$ ([Text] -> [Text]) -> [[Text]] -> [[Text]]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Text
label Text -> [Text] -> [Text]
forall a. a -> [a] -> [a]
:) ([[Text]] -> [[Text]]) -> [[[Text]]] -> [[[Text]]]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [[[Text]]]
xs

-- | @since 0.0.1.0
showEnvKeys' :: Text -> Tree Text -> [Text]
showEnvKeys' :: Text -> Tree Text -> [Text]
showEnvKeys' Text
sep Tree Text
tree = Text -> [Text] -> Text
getEnvKey Text
sep ([Text] -> Text) -> [[Text]] -> [Text]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Tree Text -> [[Text]]
getKeys Tree Text
tree

-- | @since 0.0.1.0
showEnvKeys :: forall a. (RootConfig a) => Text -> [Text]
showEnvKeys :: forall a. RootConfig a => Text -> [Text]
showEnvKeys Text
sep = Text -> [Text] -> Text
getEnvKey Text
sep ([Text] -> Text) -> [[Text]] -> [Text]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Tree Text -> [[Text]]
getKeys (Tree Text -> [[Text]]) -> Tree Text -> [[Text]]
forall a b. (a -> b) -> a -> b
$ forall a. RootConfig a => Tree Text
toRootConfig @a)