Skip to content

Commit 8366f11

Browse files
committed
Refactor constraintsPredicate
1 parent 4b93ff5 commit 8366f11

File tree

1 file changed

+19
-22
lines changed

1 file changed

+19
-22
lines changed

src/Unleash/Internal/DomainTypes.hs

+19-22
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import Data.Hash.Murmur (murmur3)
1414
import Data.List (find)
1515
import Data.Map.Strict (Map, fromList)
1616
import qualified Data.Map.Strict as Map
17-
import Data.Maybe (catMaybes, fromMaybe, listToMaybe, maybeToList)
17+
import Data.Maybe (catMaybes, fromMaybe)
1818
import Data.Text (Text)
1919
import qualified Data.Text as Text
2020
import Data.Text.Encoding (encodeUtf8)
@@ -131,7 +131,7 @@ fromJsonFeature segmentMap jsonFeature =
131131

132132
fromJsonStrategy :: MonadIO m => FeatureToggleName -> Map Int [JsonTypes.Constraint] -> JsonTypes.Strategy -> (JsonTypes.Context -> m Bool)
133133
fromJsonStrategy featureToggleName segmentMap jsonStrategy =
134-
\ctx -> liftA2 (&&) (strategyFunction ctx) (constraintsFunction ctx)
134+
\ctx -> liftA2 (&&) (strategyFunction ctx) (constraintsPredicate ctx)
135135
where
136136
strategyFunction :: MonadIO m => JsonTypes.Context -> m Bool
137137
strategyFunction =
@@ -210,27 +210,24 @@ fromJsonStrategy featureToggleName segmentMap jsonStrategy =
210210
_ -> pure . \_ctx -> False
211211

212212
segmentsToConstraints :: [Int] -> Map Int [JsonTypes.Constraint] -> [Maybe JsonTypes.Constraint]
213-
segmentsToConstraints segmentRefs segmentMap =
214-
concat $ sequence <$> ((flip Map.lookup) segmentMap <$> segmentRefs)
215-
216-
constraintsFunction :: MonadIO m => JsonTypes.Context -> m Bool
217-
constraintsFunction ctx = do
218-
let segmentRefs = concat jsonStrategy.segments
219-
segmentConstraints = segmentsToConstraints segmentRefs segmentMap
220-
justSegmentConstraints = catMaybes segmentConstraints
221-
nothingConstraints =
222-
maybeToList $
223-
listToMaybe $
224-
catMaybes $
225-
( \maybeConstraints -> case maybeConstraints of
226-
Nothing -> Just $ const False
227-
Just _ -> Nothing
228-
)
229-
<$> segmentConstraints
213+
segmentsToConstraints segmentReferences segmentMap =
214+
concat $ sequence <$> ((flip Map.lookup) segmentMap <$> segmentReferences)
215+
216+
constraintsPredicate :: MonadIO m => JsonTypes.Context -> m Bool
217+
constraintsPredicate ctx = do
218+
let segmentReferences = concat jsonStrategy.segments
219+
maybeSegmentConstraints = segmentsToConstraints segmentReferences segmentMap
220+
segmentConstraints = catMaybes maybeSegmentConstraints
230221
strategyConstraints = fromMaybe [] jsonStrategy.constraints
231-
allConstraints = justSegmentConstraints <> strategyConstraints
232-
constraints :: [JsonTypes.Context -> Bool] = (fromJsonConstraint <$> allConstraints) <> nothingConstraints
233-
pure $ null constraints || and ((\f -> f ctx) <$> constraints)
222+
allConstraints = segmentConstraints <> strategyConstraints
223+
allPredicates = fromJsonConstraint <$> allConstraints
224+
allSegmentConstraintsAreReferredTo = not $ Nothing `elem` maybeSegmentConstraints
225+
allPredicatesAreSatisfied = allSegmentConstraintsAreReferredTo && and (evaluatePredicate <$> allPredicates)
226+
thereAreNoPredicates = null allPredicates
227+
pure $ thereAreNoPredicates || allPredicatesAreSatisfied
228+
where
229+
evaluatePredicate :: (JsonTypes.Context -> Bool) -> Bool
230+
evaluatePredicate f = f ctx
234231

235232
fromJsonConstraint :: JsonTypes.Constraint -> (JsonTypes.Context -> Bool)
236233
fromJsonConstraint constraint = \ctx -> do

0 commit comments

Comments
 (0)