module Cfg.Env.Keys where
import Cfg.Source (ConfigSource (..))
import Data.Foldable
import Data.List (intersperse)
import Data.Map.Strict (empty)
import Data.Text (Text)
import KeyTree
getEnvKey
:: Text
-> [Text]
-> Text
getEnvKey :: Text -> [Text] -> Text
getEnvKey Text
sep = [Text] -> Text
forall m. Monoid m => [m] -> m
forall (t :: * -> *) m. (Foldable t, Monoid m) => t m -> m
fold ([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
getKeys :: KeyTree Text Text -> [[Text]]
getKeys :: KeyTree Text Text -> [[Text]]
getKeys = (Text -> [[Text]])
-> (Text -> KeyTree Text Text -> [[Text]] -> [[Text]])
-> [[Text]]
-> KeyTree Text Text
-> [[Text]]
forall k v a.
(Eq k, Eq v) =>
(v -> a)
-> (k -> Free (Map k) v -> a -> a) -> a -> Free (Map k) v -> a
foldKeyTree Text -> [[Text]]
valF Text -> KeyTree Text Text -> [[Text]] -> [[Text]]
stepF []
where
stepF :: Text -> Free (Map Text) Text -> [[Text]] -> [[Text]]
stepF :: Text -> KeyTree Text Text -> [[Text]] -> [[Text]]
stepF Text
key (Pure Text
_) [[Text]]
acc = [Text
key] [Text] -> [[Text]] -> [[Text]]
forall a. a -> [a] -> [a]
: [[Text]]
acc
stepF Text
key t :: KeyTree Text Text
t@(Free Map Text (KeyTree Text Text)
m) [[Text]]
acc =
if Map Text (KeyTree Text Text)
m Map Text (KeyTree Text Text)
-> Map Text (KeyTree Text Text) -> Bool
forall a. Eq a => a -> a -> Bool
== Map Text (KeyTree Text Text)
forall k a. Map k a
empty
then [Text
key] [Text] -> [[Text]] -> [[Text]]
forall a. a -> [a] -> [a]
: [[Text]]
acc
else ([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
key Text -> [Text] -> [Text]
forall a. a -> [a] -> [a]
:) (KeyTree Text Text -> [[Text]]
getKeys KeyTree Text Text
t) [[Text]] -> [[Text]] -> [[Text]]
forall a. Semigroup a => a -> a -> a
<> [[Text]]
acc
valF :: Text -> [[Text]]
valF :: Text -> [[Text]]
valF Text
_ = []
showEnvKeys'
:: Text
-> KeyTree Text Text
-> [Text]
showEnvKeys' :: Text -> KeyTree Text Text -> [Text]
showEnvKeys' Text
sep KeyTree Text Text
tree = Text -> [Text] -> Text
getEnvKey Text
sep ([Text] -> Text) -> [[Text]] -> [Text]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> KeyTree Text Text -> [[Text]]
getKeys KeyTree Text Text
tree
showEnvKeys :: forall a. (ConfigSource a) => Text -> [Text]
showEnvKeys :: forall {k} (a :: k). ConfigSource 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
<$> (KeyTree Text Text -> [[Text]]
getKeys (KeyTree Text Text -> [[Text]]) -> KeyTree Text Text -> [[Text]]
forall a b. (a -> b) -> a -> b
$ forall (a :: k). ConfigSource a => KeyTree Text Text
forall {k} (a :: k). ConfigSource a => KeyTree Text Text
configSource @a)