module Control.Flipper
( enabled
, enabledFor
, enable
, enableFor
, enableForPercentage
, disable
, toggle
, whenEnabled
, whenEnabledFor
, module Control.Flipper.Types
) where
import Control.Monad (when)
import Data.Monoid ((<>))
import qualified Data.Set as S
import Control.Flipper.Types
whenEnabled :: (HasFeatureFlags m)
=> FeatureName -> m () -> m ()
whenEnabled fName f = do
featureEnabled <- enabled fName
when featureEnabled f
whenEnabledFor :: (HasFeatureFlags m, HasActorId a)
=> FeatureName -> a -> m () -> m ()
whenEnabledFor fName actor f = do
featureEnabled <- enabledFor fName actor
when featureEnabled f
enabled :: HasFeatureFlags m
=> FeatureName -> m Bool
enabled fName = do
mFeature <- getFeature fName
case mFeature of
(Just feature) -> return $ isEnabled feature
Nothing -> return False
enabledFor :: (HasFeatureFlags m, HasActorId a)
=> FeatureName -> a -> m Bool
enabledFor fName actor = do
mFeature <- getFeature fName
case mFeature of
Nothing -> return False
(Just feature) -> return $ isEnabledFor feature actor
enable :: ModifiesFeatureFlags m
=> FeatureName -> m ()
enable fName = upsertFeature fName True
enableFor :: (ModifiesFeatureFlags m, HasActorId a)
=> FeatureName -> a -> m ()
enableFor fName actor = update fName (enableFor' actor fName)
enableFor' :: HasActorId a => a -> FeatureName -> Maybe Feature -> Maybe Feature
enableFor' actor _ (Just feature) = Just $ feature { enabledActors = S.insert (actorId actor) (enabledActors feature) }
enableFor' actor fname Nothing = Just $ (mkFeature fname) { enabledActors = S.singleton (actorId actor) }
enableForPercentage :: (ModifiesFeatureFlags m)
=> FeatureName -> Percentage -> m ()
enableForPercentage fName pct
| pct < 0 = raiseOutOfRangeError
| pct > 100 = raiseOutOfRangeError
| otherwise = update fName (enableForPercentage' pct fName)
where
raiseOutOfRangeError = error ("Invalid percentage: " <> show pct <> " Expected a value between 0 - 100")
enableForPercentage' :: Percentage -> FeatureName -> Maybe Feature -> Maybe Feature
enableForPercentage' pct _ (Just feature) = Just $ feature { enabledPercentage = pct }
enableForPercentage' pct fname Nothing = Just (mkFeature fname) { enabledPercentage = pct }
disable :: ModifiesFeatureFlags m
=> FeatureName -> m ()
disable fName = upsertFeature fName False
toggle :: ModifiesFeatureFlags m
=> FeatureName -> m ()
toggle fName = update fName flipIt'
where
flipIt' :: Maybe Feature -> Maybe Feature
flipIt' (Just feature) = Just (feature { isEnabled = not (isEnabled feature) })
flipIt' Nothing = Just $ (mkFeature fName) { isEnabled = True }
upsertFeature :: ModifiesFeatureFlags m
=> FeatureName -> Bool -> m ()
upsertFeature fName featureEnabled =
update fName upsertFeature'
where
upsertFeature' :: (Maybe Feature -> Maybe Feature)
upsertFeature' Nothing = Just $ (mkFeature fName) { isEnabled = featureEnabled }
upsertFeature' (Just feature) = Just (feature { isEnabled = featureEnabled })