module Control.Flipper
( enabled
, enable
, disable
, toggle
, whenEnabled
, module Control.Flipper.Types
) where
import Control.Monad (void, when)
import qualified Data.Map.Strict as M
import Control.Flipper.Types (FeatureName(..), Features(..),
HasFeatureFlags(..), ModifiesFeatureFlags(..), mkFeatures)
whenEnabled :: (HasFeatureFlags m)
=> FeatureName -> m () -> m ()
whenEnabled fName f = do
isEnabled <- enabled fName
when isEnabled f
enabled :: HasFeatureFlags m
=> FeatureName -> m Bool
enabled fName = do
features <- unFeatures <$> getFeatures
if M.lookup fName features == Just True
then return True
else return False
enable :: ModifiesFeatureFlags m
=> FeatureName -> m ()
enable fName = update fName (\_ -> Just True)
disable :: ModifiesFeatureFlags m
=> FeatureName -> m ()
disable fName = update fName (\_ -> Just False)
toggle :: ModifiesFeatureFlags m
=> FeatureName -> m ()
toggle fName = update fName flipIt'
where
flipIt' :: Maybe Bool -> Maybe Bool
flipIt' (Just a) = Just (not a)
flipIt' Nothing = Just True
update :: ModifiesFeatureFlags m
=> FeatureName -> (Maybe Bool -> Maybe Bool) -> m ()
update fName updateFn = do
features <- unFeatures <$> getFeatures
void . updateFeatures . Features $ M.alter updateFn fName features