packages feed

henforcer-1.0.0.0: src/Henforcer/Rules/ConditionallyEnforced.hs

{- |
Module      : Henforcer.Rules.ConditionallyEnforced
Description :
Copyright   : (c) Flipstone Technology Partners, 2024-2026
License     : MIT
Maintainer  : maintainers@flipstone.com
-}
module Henforcer.Rules.ConditionallyEnforced
  ( ConditionallyEnforced (..)
  , conditionallyEnforcedCodec
  ) where

import qualified Toml

-- | A more expressive 'Maybe'
data ConditionallyEnforced a
  = Enforced !a
  | NotEnforced
  deriving (Eq, Show)

conditionallyEnforcedCodec ::
  (Toml.Key -> Toml.TomlCodec a) -> Toml.Key -> Toml.TomlCodec (ConditionallyEnforced a)
{-# INLINEABLE conditionallyEnforcedCodec #-}
conditionallyEnforcedCodec underlyingCodec =
  Toml.dimap maybeFromConditionallyEnforced conditionallyEnforcedFromMaybe
    . Toml.dioptional
    . underlyingCodec

conditionallyEnforcedFromMaybe :: Maybe a -> ConditionallyEnforced a
conditionallyEnforcedFromMaybe Nothing = NotEnforced
conditionallyEnforcedFromMaybe (Just x) = Enforced x

maybeFromConditionallyEnforced :: ConditionallyEnforced a -> Maybe a
maybeFromConditionallyEnforced NotEnforced = Nothing
maybeFromConditionallyEnforced (Enforced x) = Just x