-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/


-- | A simple library for dynamically enabling and disabling functionality.
--   
--   A simple library for dynamically enabling and disabling functionality.
@package feature-flags
@version 0.1.0.1


-- | A small utility module that provides a foundation for dynamically
--   enabling and disabling features.
module Control.FeatureFlag

-- | A simple toggle for selectively enabling or disabling functionality.
data FeatureToggle a
Enabled :: FeatureToggle a
Disabled :: FeatureToggle a

-- | A union of different feature providers which maintains a currently
--   active provider and facilities for changing providers.
--   
--   Use this when you don't need to disable a feature, just to replace the
--   implementation.
data FeatureProvider a
FeatureProvider :: a -> Text -> [(Text, a)] -> a -> FeatureProvider a
[enabledProvider] :: FeatureProvider a -> a
[enabledProviderName] :: FeatureProvider a -> Text
[availableProviders] :: FeatureProvider a -> [(Text, a)]
[defaultProvider] :: FeatureProvider a -> a

-- | Enable a feature.
enable :: FeatureToggle a -> FeatureToggle a

-- | Disable a feature.
disable :: FeatureToggle a -> FeatureToggle a

-- | Flip a toggle from enabled to disabled or vice versa.
toggle :: FeatureToggle a -> FeatureToggle a

-- | Switch on values depending on whether a toggle is enabled or disabled.
withToggle :: FeatureToggle a -> b -> b -> b

-- | Execute an action only when the specified feature is enabled.
whenEnabled :: (Functor m, Monad m) => FeatureToggle a -> m b -> m ()

-- | Execute an action only when the specified feature is disabled.
whenDisabled :: (Functor m, Monad m) => FeatureToggle a -> m b -> m ()

-- | Replace the current feature provider with another provider. Returns
--   Left if the default provider is used due to a failed lookup. Returns
--   Right if the lookup succeeded.
--   
--   Use "default" as the lookup value if you want to explicitly load the
--   default provider.
use :: Text -> FeatureProvider a -> Either (FeatureProvider a) (FeatureProvider a)

-- | Apply a function that takes a feature provided by a
--   <a>FeatureProvider</a>.
withProvider :: FeatureProvider a -> (a -> b) -> b
instance GHC.Classes.Eq (Control.FeatureFlag.FeatureToggle a)
instance GHC.Show.Show (Control.FeatureFlag.FeatureToggle a)
instance GHC.Read.Read (Control.FeatureFlag.FeatureToggle a)
