{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE StrictData #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# OPTIONS_GHC -fno-warn-unused-binds #-}
{-# OPTIONS_GHC -fno-warn-unused-imports #-}
{-# OPTIONS_GHC -fno-warn-unused-matches #-}

-- Derived from AWS service descriptions, licensed under Apache 2.0.

-- |
-- Module      : Amazonka.Evidently.UpdateExperiment
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Updates an Evidently experiment.
--
-- Don\'t use this operation to update an experiment\'s tag. Instead, use
-- <https://docs.aws.amazon.com/cloudwatchevidently/latest/APIReference/API_TagResource.html TagResource>.
module Amazonka.Evidently.UpdateExperiment
  ( -- * Creating a Request
    UpdateExperiment (..),
    newUpdateExperiment,

    -- * Request Lenses
    updateExperiment_description,
    updateExperiment_metricGoals,
    updateExperiment_onlineAbConfig,
    updateExperiment_randomizationSalt,
    updateExperiment_removeSegment,
    updateExperiment_samplingRate,
    updateExperiment_segment,
    updateExperiment_treatments,
    updateExperiment_experiment,
    updateExperiment_project,

    -- * Destructuring the Response
    UpdateExperimentResponse (..),
    newUpdateExperimentResponse,

    -- * Response Lenses
    updateExperimentResponse_httpStatus,
    updateExperimentResponse_experiment,
  )
where

import qualified Amazonka.Core as Core
import qualified Amazonka.Core.Lens.Internal as Lens
import qualified Amazonka.Data as Data
import Amazonka.Evidently.Types
import qualified Amazonka.Prelude as Prelude
import qualified Amazonka.Request as Request
import qualified Amazonka.Response as Response

-- | /See:/ 'newUpdateExperiment' smart constructor.
data UpdateExperiment = UpdateExperiment'
  { -- | An optional description of the experiment.
    UpdateExperiment -> Maybe Text
description :: Prelude.Maybe Prelude.Text,
    -- | An array of structures that defines the metrics used for the experiment,
    -- and whether a higher or lower value for each metric is the goal.
    UpdateExperiment -> Maybe (NonEmpty MetricGoalConfig)
metricGoals :: Prelude.Maybe (Prelude.NonEmpty MetricGoalConfig),
    -- | A structure that contains the configuration of which variation o use as
    -- the \"control\" version. The \"control\" version is used for comparison
    -- with other variations. This structure also specifies how much experiment
    -- traffic is allocated to each variation.
    UpdateExperiment -> Maybe OnlineAbConfig
onlineAbConfig :: Prelude.Maybe OnlineAbConfig,
    -- | When Evidently assigns a particular user session to an experiment, it
    -- must use a randomization ID to determine which variation the user
    -- session is served. This randomization ID is a combination of the entity
    -- ID and @randomizationSalt@. If you omit @randomizationSalt@, Evidently
    -- uses the experiment name as the @randomizationSalt@.
    UpdateExperiment -> Maybe Text
randomizationSalt :: Prelude.Maybe Prelude.Text,
    -- | Removes a segment from being used in an experiment. You can\'t use this
    -- parameter if the experiment is currently running.
    UpdateExperiment -> Maybe Bool
removeSegment :: Prelude.Maybe Prelude.Bool,
    -- | The portion of the available audience that you want to allocate to this
    -- experiment, in thousandths of a percent. The available audience is the
    -- total audience minus the audience that you have allocated to overrides
    -- or current launches of this feature.
    --
    -- This is represented in thousandths of a percent. For example, specify
    -- 20,000 to allocate 20% of the available audience.
    UpdateExperiment -> Maybe Natural
samplingRate :: Prelude.Maybe Prelude.Natural,
    -- | Adds an audience /segment/ to an experiment. When a segment is used in
    -- an experiment, only user sessions that match the segment pattern are
    -- used in the experiment. You can\'t use this parameter if the experiment
    -- is currently running.
    UpdateExperiment -> Maybe Text
segment :: Prelude.Maybe Prelude.Text,
    -- | An array of structures that define the variations being tested in the
    -- experiment.
    UpdateExperiment -> Maybe [TreatmentConfig]
treatments :: Prelude.Maybe [TreatmentConfig],
    -- | The name of the experiment to update.
    UpdateExperiment -> Text
experiment :: Prelude.Text,
    -- | The name or ARN of the project that contains the experiment that you
    -- want to update.
    UpdateExperiment -> Text
project :: Prelude.Text
  }
  deriving (UpdateExperiment -> UpdateExperiment -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: UpdateExperiment -> UpdateExperiment -> Bool
$c/= :: UpdateExperiment -> UpdateExperiment -> Bool
== :: UpdateExperiment -> UpdateExperiment -> Bool
$c== :: UpdateExperiment -> UpdateExperiment -> Bool
Prelude.Eq, ReadPrec [UpdateExperiment]
ReadPrec UpdateExperiment
Int -> ReadS UpdateExperiment
ReadS [UpdateExperiment]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [UpdateExperiment]
$creadListPrec :: ReadPrec [UpdateExperiment]
readPrec :: ReadPrec UpdateExperiment
$creadPrec :: ReadPrec UpdateExperiment
readList :: ReadS [UpdateExperiment]
$creadList :: ReadS [UpdateExperiment]
readsPrec :: Int -> ReadS UpdateExperiment
$creadsPrec :: Int -> ReadS UpdateExperiment
Prelude.Read, Int -> UpdateExperiment -> ShowS
[UpdateExperiment] -> ShowS
UpdateExperiment -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [UpdateExperiment] -> ShowS
$cshowList :: [UpdateExperiment] -> ShowS
show :: UpdateExperiment -> String
$cshow :: UpdateExperiment -> String
showsPrec :: Int -> UpdateExperiment -> ShowS
$cshowsPrec :: Int -> UpdateExperiment -> ShowS
Prelude.Show, forall x. Rep UpdateExperiment x -> UpdateExperiment
forall x. UpdateExperiment -> Rep UpdateExperiment x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep UpdateExperiment x -> UpdateExperiment
$cfrom :: forall x. UpdateExperiment -> Rep UpdateExperiment x
Prelude.Generic)

-- |
-- Create a value of 'UpdateExperiment' with all optional fields omitted.
--
-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
--
-- The following record fields are available, with the corresponding lenses provided
-- for backwards compatibility:
--
-- 'description', 'updateExperiment_description' - An optional description of the experiment.
--
-- 'metricGoals', 'updateExperiment_metricGoals' - An array of structures that defines the metrics used for the experiment,
-- and whether a higher or lower value for each metric is the goal.
--
-- 'onlineAbConfig', 'updateExperiment_onlineAbConfig' - A structure that contains the configuration of which variation o use as
-- the \"control\" version. The \"control\" version is used for comparison
-- with other variations. This structure also specifies how much experiment
-- traffic is allocated to each variation.
--
-- 'randomizationSalt', 'updateExperiment_randomizationSalt' - When Evidently assigns a particular user session to an experiment, it
-- must use a randomization ID to determine which variation the user
-- session is served. This randomization ID is a combination of the entity
-- ID and @randomizationSalt@. If you omit @randomizationSalt@, Evidently
-- uses the experiment name as the @randomizationSalt@.
--
-- 'removeSegment', 'updateExperiment_removeSegment' - Removes a segment from being used in an experiment. You can\'t use this
-- parameter if the experiment is currently running.
--
-- 'samplingRate', 'updateExperiment_samplingRate' - The portion of the available audience that you want to allocate to this
-- experiment, in thousandths of a percent. The available audience is the
-- total audience minus the audience that you have allocated to overrides
-- or current launches of this feature.
--
-- This is represented in thousandths of a percent. For example, specify
-- 20,000 to allocate 20% of the available audience.
--
-- 'segment', 'updateExperiment_segment' - Adds an audience /segment/ to an experiment. When a segment is used in
-- an experiment, only user sessions that match the segment pattern are
-- used in the experiment. You can\'t use this parameter if the experiment
-- is currently running.
--
-- 'treatments', 'updateExperiment_treatments' - An array of structures that define the variations being tested in the
-- experiment.
--
-- 'experiment', 'updateExperiment_experiment' - The name of the experiment to update.
--
-- 'project', 'updateExperiment_project' - The name or ARN of the project that contains the experiment that you
-- want to update.
newUpdateExperiment ::
  -- | 'experiment'
  Prelude.Text ->
  -- | 'project'
  Prelude.Text ->
  UpdateExperiment
newUpdateExperiment :: Text -> Text -> UpdateExperiment
newUpdateExperiment Text
pExperiment_ Text
pProject_ =
  UpdateExperiment'
    { $sel:description:UpdateExperiment' :: Maybe Text
description = forall a. Maybe a
Prelude.Nothing,
      $sel:metricGoals:UpdateExperiment' :: Maybe (NonEmpty MetricGoalConfig)
metricGoals = forall a. Maybe a
Prelude.Nothing,
      $sel:onlineAbConfig:UpdateExperiment' :: Maybe OnlineAbConfig
onlineAbConfig = forall a. Maybe a
Prelude.Nothing,
      $sel:randomizationSalt:UpdateExperiment' :: Maybe Text
randomizationSalt = forall a. Maybe a
Prelude.Nothing,
      $sel:removeSegment:UpdateExperiment' :: Maybe Bool
removeSegment = forall a. Maybe a
Prelude.Nothing,
      $sel:samplingRate:UpdateExperiment' :: Maybe Natural
samplingRate = forall a. Maybe a
Prelude.Nothing,
      $sel:segment:UpdateExperiment' :: Maybe Text
segment = forall a. Maybe a
Prelude.Nothing,
      $sel:treatments:UpdateExperiment' :: Maybe [TreatmentConfig]
treatments = forall a. Maybe a
Prelude.Nothing,
      $sel:experiment:UpdateExperiment' :: Text
experiment = Text
pExperiment_,
      $sel:project:UpdateExperiment' :: Text
project = Text
pProject_
    }

-- | An optional description of the experiment.
updateExperiment_description :: Lens.Lens' UpdateExperiment (Prelude.Maybe Prelude.Text)
updateExperiment_description :: Lens' UpdateExperiment (Maybe Text)
updateExperiment_description = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\UpdateExperiment' {Maybe Text
description :: Maybe Text
$sel:description:UpdateExperiment' :: UpdateExperiment -> Maybe Text
description} -> Maybe Text
description) (\s :: UpdateExperiment
s@UpdateExperiment' {} Maybe Text
a -> UpdateExperiment
s {$sel:description:UpdateExperiment' :: Maybe Text
description = Maybe Text
a} :: UpdateExperiment)

-- | An array of structures that defines the metrics used for the experiment,
-- and whether a higher or lower value for each metric is the goal.
updateExperiment_metricGoals :: Lens.Lens' UpdateExperiment (Prelude.Maybe (Prelude.NonEmpty MetricGoalConfig))
updateExperiment_metricGoals :: Lens' UpdateExperiment (Maybe (NonEmpty MetricGoalConfig))
updateExperiment_metricGoals = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\UpdateExperiment' {Maybe (NonEmpty MetricGoalConfig)
metricGoals :: Maybe (NonEmpty MetricGoalConfig)
$sel:metricGoals:UpdateExperiment' :: UpdateExperiment -> Maybe (NonEmpty MetricGoalConfig)
metricGoals} -> Maybe (NonEmpty MetricGoalConfig)
metricGoals) (\s :: UpdateExperiment
s@UpdateExperiment' {} Maybe (NonEmpty MetricGoalConfig)
a -> UpdateExperiment
s {$sel:metricGoals:UpdateExperiment' :: Maybe (NonEmpty MetricGoalConfig)
metricGoals = Maybe (NonEmpty MetricGoalConfig)
a} :: UpdateExperiment) forall b c a. (b -> c) -> (a -> b) -> a -> c
Prelude.. forall (f :: * -> *) (g :: * -> *) s t a b.
(Functor f, Functor g) =>
AnIso s t a b -> Iso (f s) (g t) (f a) (g b)
Lens.mapping forall s t a b. (Coercible s a, Coercible t b) => Iso s t a b
Lens.coerced

-- | A structure that contains the configuration of which variation o use as
-- the \"control\" version. The \"control\" version is used for comparison
-- with other variations. This structure also specifies how much experiment
-- traffic is allocated to each variation.
updateExperiment_onlineAbConfig :: Lens.Lens' UpdateExperiment (Prelude.Maybe OnlineAbConfig)
updateExperiment_onlineAbConfig :: Lens' UpdateExperiment (Maybe OnlineAbConfig)
updateExperiment_onlineAbConfig = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\UpdateExperiment' {Maybe OnlineAbConfig
onlineAbConfig :: Maybe OnlineAbConfig
$sel:onlineAbConfig:UpdateExperiment' :: UpdateExperiment -> Maybe OnlineAbConfig
onlineAbConfig} -> Maybe OnlineAbConfig
onlineAbConfig) (\s :: UpdateExperiment
s@UpdateExperiment' {} Maybe OnlineAbConfig
a -> UpdateExperiment
s {$sel:onlineAbConfig:UpdateExperiment' :: Maybe OnlineAbConfig
onlineAbConfig = Maybe OnlineAbConfig
a} :: UpdateExperiment)

-- | When Evidently assigns a particular user session to an experiment, it
-- must use a randomization ID to determine which variation the user
-- session is served. This randomization ID is a combination of the entity
-- ID and @randomizationSalt@. If you omit @randomizationSalt@, Evidently
-- uses the experiment name as the @randomizationSalt@.
updateExperiment_randomizationSalt :: Lens.Lens' UpdateExperiment (Prelude.Maybe Prelude.Text)
updateExperiment_randomizationSalt :: Lens' UpdateExperiment (Maybe Text)
updateExperiment_randomizationSalt = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\UpdateExperiment' {Maybe Text
randomizationSalt :: Maybe Text
$sel:randomizationSalt:UpdateExperiment' :: UpdateExperiment -> Maybe Text
randomizationSalt} -> Maybe Text
randomizationSalt) (\s :: UpdateExperiment
s@UpdateExperiment' {} Maybe Text
a -> UpdateExperiment
s {$sel:randomizationSalt:UpdateExperiment' :: Maybe Text
randomizationSalt = Maybe Text
a} :: UpdateExperiment)

-- | Removes a segment from being used in an experiment. You can\'t use this
-- parameter if the experiment is currently running.
updateExperiment_removeSegment :: Lens.Lens' UpdateExperiment (Prelude.Maybe Prelude.Bool)
updateExperiment_removeSegment :: Lens' UpdateExperiment (Maybe Bool)
updateExperiment_removeSegment = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\UpdateExperiment' {Maybe Bool
removeSegment :: Maybe Bool
$sel:removeSegment:UpdateExperiment' :: UpdateExperiment -> Maybe Bool
removeSegment} -> Maybe Bool
removeSegment) (\s :: UpdateExperiment
s@UpdateExperiment' {} Maybe Bool
a -> UpdateExperiment
s {$sel:removeSegment:UpdateExperiment' :: Maybe Bool
removeSegment = Maybe Bool
a} :: UpdateExperiment)

-- | The portion of the available audience that you want to allocate to this
-- experiment, in thousandths of a percent. The available audience is the
-- total audience minus the audience that you have allocated to overrides
-- or current launches of this feature.
--
-- This is represented in thousandths of a percent. For example, specify
-- 20,000 to allocate 20% of the available audience.
updateExperiment_samplingRate :: Lens.Lens' UpdateExperiment (Prelude.Maybe Prelude.Natural)
updateExperiment_samplingRate :: Lens' UpdateExperiment (Maybe Natural)
updateExperiment_samplingRate = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\UpdateExperiment' {Maybe Natural
samplingRate :: Maybe Natural
$sel:samplingRate:UpdateExperiment' :: UpdateExperiment -> Maybe Natural
samplingRate} -> Maybe Natural
samplingRate) (\s :: UpdateExperiment
s@UpdateExperiment' {} Maybe Natural
a -> UpdateExperiment
s {$sel:samplingRate:UpdateExperiment' :: Maybe Natural
samplingRate = Maybe Natural
a} :: UpdateExperiment)

-- | Adds an audience /segment/ to an experiment. When a segment is used in
-- an experiment, only user sessions that match the segment pattern are
-- used in the experiment. You can\'t use this parameter if the experiment
-- is currently running.
updateExperiment_segment :: Lens.Lens' UpdateExperiment (Prelude.Maybe Prelude.Text)
updateExperiment_segment :: Lens' UpdateExperiment (Maybe Text)
updateExperiment_segment = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\UpdateExperiment' {Maybe Text
segment :: Maybe Text
$sel:segment:UpdateExperiment' :: UpdateExperiment -> Maybe Text
segment} -> Maybe Text
segment) (\s :: UpdateExperiment
s@UpdateExperiment' {} Maybe Text
a -> UpdateExperiment
s {$sel:segment:UpdateExperiment' :: Maybe Text
segment = Maybe Text
a} :: UpdateExperiment)

-- | An array of structures that define the variations being tested in the
-- experiment.
updateExperiment_treatments :: Lens.Lens' UpdateExperiment (Prelude.Maybe [TreatmentConfig])
updateExperiment_treatments :: Lens' UpdateExperiment (Maybe [TreatmentConfig])
updateExperiment_treatments = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\UpdateExperiment' {Maybe [TreatmentConfig]
treatments :: Maybe [TreatmentConfig]
$sel:treatments:UpdateExperiment' :: UpdateExperiment -> Maybe [TreatmentConfig]
treatments} -> Maybe [TreatmentConfig]
treatments) (\s :: UpdateExperiment
s@UpdateExperiment' {} Maybe [TreatmentConfig]
a -> UpdateExperiment
s {$sel:treatments:UpdateExperiment' :: Maybe [TreatmentConfig]
treatments = Maybe [TreatmentConfig]
a} :: UpdateExperiment) forall b c a. (b -> c) -> (a -> b) -> a -> c
Prelude.. forall (f :: * -> *) (g :: * -> *) s t a b.
(Functor f, Functor g) =>
AnIso s t a b -> Iso (f s) (g t) (f a) (g b)
Lens.mapping forall s t a b. (Coercible s a, Coercible t b) => Iso s t a b
Lens.coerced

-- | The name of the experiment to update.
updateExperiment_experiment :: Lens.Lens' UpdateExperiment Prelude.Text
updateExperiment_experiment :: Lens' UpdateExperiment Text
updateExperiment_experiment = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\UpdateExperiment' {Text
experiment :: Text
$sel:experiment:UpdateExperiment' :: UpdateExperiment -> Text
experiment} -> Text
experiment) (\s :: UpdateExperiment
s@UpdateExperiment' {} Text
a -> UpdateExperiment
s {$sel:experiment:UpdateExperiment' :: Text
experiment = Text
a} :: UpdateExperiment)

-- | The name or ARN of the project that contains the experiment that you
-- want to update.
updateExperiment_project :: Lens.Lens' UpdateExperiment Prelude.Text
updateExperiment_project :: Lens' UpdateExperiment Text
updateExperiment_project = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\UpdateExperiment' {Text
project :: Text
$sel:project:UpdateExperiment' :: UpdateExperiment -> Text
project} -> Text
project) (\s :: UpdateExperiment
s@UpdateExperiment' {} Text
a -> UpdateExperiment
s {$sel:project:UpdateExperiment' :: Text
project = Text
a} :: UpdateExperiment)

instance Core.AWSRequest UpdateExperiment where
  type
    AWSResponse UpdateExperiment =
      UpdateExperimentResponse
  request :: (Service -> Service)
-> UpdateExperiment -> Request UpdateExperiment
request Service -> Service
overrides =
    forall a. (ToRequest a, ToJSON a) => Service -> a -> Request a
Request.patchJSON (Service -> Service
overrides Service
defaultService)
  response :: forall (m :: * -> *).
MonadResource m =>
(ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy UpdateExperiment
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse UpdateExperiment)))
response =
    forall (m :: * -> *) a.
MonadResource m =>
(Int -> ResponseHeaders -> Object -> Either String (AWSResponse a))
-> (ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy a
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse a)))
Response.receiveJSON
      ( \Int
s ResponseHeaders
h Object
x ->
          Int -> Experiment -> UpdateExperimentResponse
UpdateExperimentResponse'
            forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> (forall (f :: * -> *) a. Applicative f => a -> f a
Prelude.pure (forall a. Enum a => a -> Int
Prelude.fromEnum Int
s))
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Either String a
Data..:> Key
"experiment")
      )

instance Prelude.Hashable UpdateExperiment where
  hashWithSalt :: Int -> UpdateExperiment -> Int
hashWithSalt Int
_salt UpdateExperiment' {Maybe Bool
Maybe Natural
Maybe [TreatmentConfig]
Maybe (NonEmpty MetricGoalConfig)
Maybe Text
Maybe OnlineAbConfig
Text
project :: Text
experiment :: Text
treatments :: Maybe [TreatmentConfig]
segment :: Maybe Text
samplingRate :: Maybe Natural
removeSegment :: Maybe Bool
randomizationSalt :: Maybe Text
onlineAbConfig :: Maybe OnlineAbConfig
metricGoals :: Maybe (NonEmpty MetricGoalConfig)
description :: Maybe Text
$sel:project:UpdateExperiment' :: UpdateExperiment -> Text
$sel:experiment:UpdateExperiment' :: UpdateExperiment -> Text
$sel:treatments:UpdateExperiment' :: UpdateExperiment -> Maybe [TreatmentConfig]
$sel:segment:UpdateExperiment' :: UpdateExperiment -> Maybe Text
$sel:samplingRate:UpdateExperiment' :: UpdateExperiment -> Maybe Natural
$sel:removeSegment:UpdateExperiment' :: UpdateExperiment -> Maybe Bool
$sel:randomizationSalt:UpdateExperiment' :: UpdateExperiment -> Maybe Text
$sel:onlineAbConfig:UpdateExperiment' :: UpdateExperiment -> Maybe OnlineAbConfig
$sel:metricGoals:UpdateExperiment' :: UpdateExperiment -> Maybe (NonEmpty MetricGoalConfig)
$sel:description:UpdateExperiment' :: UpdateExperiment -> Maybe Text
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Text
description
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe (NonEmpty MetricGoalConfig)
metricGoals
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe OnlineAbConfig
onlineAbConfig
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Text
randomizationSalt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Bool
removeSegment
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Natural
samplingRate
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Text
segment
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe [TreatmentConfig]
treatments
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
experiment
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
project

instance Prelude.NFData UpdateExperiment where
  rnf :: UpdateExperiment -> ()
rnf UpdateExperiment' {Maybe Bool
Maybe Natural
Maybe [TreatmentConfig]
Maybe (NonEmpty MetricGoalConfig)
Maybe Text
Maybe OnlineAbConfig
Text
project :: Text
experiment :: Text
treatments :: Maybe [TreatmentConfig]
segment :: Maybe Text
samplingRate :: Maybe Natural
removeSegment :: Maybe Bool
randomizationSalt :: Maybe Text
onlineAbConfig :: Maybe OnlineAbConfig
metricGoals :: Maybe (NonEmpty MetricGoalConfig)
description :: Maybe Text
$sel:project:UpdateExperiment' :: UpdateExperiment -> Text
$sel:experiment:UpdateExperiment' :: UpdateExperiment -> Text
$sel:treatments:UpdateExperiment' :: UpdateExperiment -> Maybe [TreatmentConfig]
$sel:segment:UpdateExperiment' :: UpdateExperiment -> Maybe Text
$sel:samplingRate:UpdateExperiment' :: UpdateExperiment -> Maybe Natural
$sel:removeSegment:UpdateExperiment' :: UpdateExperiment -> Maybe Bool
$sel:randomizationSalt:UpdateExperiment' :: UpdateExperiment -> Maybe Text
$sel:onlineAbConfig:UpdateExperiment' :: UpdateExperiment -> Maybe OnlineAbConfig
$sel:metricGoals:UpdateExperiment' :: UpdateExperiment -> Maybe (NonEmpty MetricGoalConfig)
$sel:description:UpdateExperiment' :: UpdateExperiment -> Maybe Text
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
description
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe (NonEmpty MetricGoalConfig)
metricGoals
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe OnlineAbConfig
onlineAbConfig
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
randomizationSalt
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Bool
removeSegment
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Natural
samplingRate
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
segment
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe [TreatmentConfig]
treatments
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
experiment
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
project

instance Data.ToHeaders UpdateExperiment where
  toHeaders :: UpdateExperiment -> ResponseHeaders
toHeaders =
    forall a b. a -> b -> a
Prelude.const
      ( forall a. Monoid a => [a] -> a
Prelude.mconcat
          [ HeaderName
"Content-Type"
              forall a. ToHeader a => HeaderName -> a -> ResponseHeaders
Data.=# ( ByteString
"application/x-amz-json-1.1" ::
                          Prelude.ByteString
                      )
          ]
      )

instance Data.ToJSON UpdateExperiment where
  toJSON :: UpdateExperiment -> Value
toJSON UpdateExperiment' {Maybe Bool
Maybe Natural
Maybe [TreatmentConfig]
Maybe (NonEmpty MetricGoalConfig)
Maybe Text
Maybe OnlineAbConfig
Text
project :: Text
experiment :: Text
treatments :: Maybe [TreatmentConfig]
segment :: Maybe Text
samplingRate :: Maybe Natural
removeSegment :: Maybe Bool
randomizationSalt :: Maybe Text
onlineAbConfig :: Maybe OnlineAbConfig
metricGoals :: Maybe (NonEmpty MetricGoalConfig)
description :: Maybe Text
$sel:project:UpdateExperiment' :: UpdateExperiment -> Text
$sel:experiment:UpdateExperiment' :: UpdateExperiment -> Text
$sel:treatments:UpdateExperiment' :: UpdateExperiment -> Maybe [TreatmentConfig]
$sel:segment:UpdateExperiment' :: UpdateExperiment -> Maybe Text
$sel:samplingRate:UpdateExperiment' :: UpdateExperiment -> Maybe Natural
$sel:removeSegment:UpdateExperiment' :: UpdateExperiment -> Maybe Bool
$sel:randomizationSalt:UpdateExperiment' :: UpdateExperiment -> Maybe Text
$sel:onlineAbConfig:UpdateExperiment' :: UpdateExperiment -> Maybe OnlineAbConfig
$sel:metricGoals:UpdateExperiment' :: UpdateExperiment -> Maybe (NonEmpty MetricGoalConfig)
$sel:description:UpdateExperiment' :: UpdateExperiment -> Maybe Text
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ (Key
"description" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..=) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe Text
description,
            (Key
"metricGoals" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..=) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe (NonEmpty MetricGoalConfig)
metricGoals,
            (Key
"onlineAbConfig" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..=)
              forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe OnlineAbConfig
onlineAbConfig,
            (Key
"randomizationSalt" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..=)
              forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe Text
randomizationSalt,
            (Key
"removeSegment" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..=) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe Bool
removeSegment,
            (Key
"samplingRate" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..=) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe Natural
samplingRate,
            (Key
"segment" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..=) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe Text
segment,
            (Key
"treatments" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..=) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe [TreatmentConfig]
treatments
          ]
      )

instance Data.ToPath UpdateExperiment where
  toPath :: UpdateExperiment -> ByteString
toPath UpdateExperiment' {Maybe Bool
Maybe Natural
Maybe [TreatmentConfig]
Maybe (NonEmpty MetricGoalConfig)
Maybe Text
Maybe OnlineAbConfig
Text
project :: Text
experiment :: Text
treatments :: Maybe [TreatmentConfig]
segment :: Maybe Text
samplingRate :: Maybe Natural
removeSegment :: Maybe Bool
randomizationSalt :: Maybe Text
onlineAbConfig :: Maybe OnlineAbConfig
metricGoals :: Maybe (NonEmpty MetricGoalConfig)
description :: Maybe Text
$sel:project:UpdateExperiment' :: UpdateExperiment -> Text
$sel:experiment:UpdateExperiment' :: UpdateExperiment -> Text
$sel:treatments:UpdateExperiment' :: UpdateExperiment -> Maybe [TreatmentConfig]
$sel:segment:UpdateExperiment' :: UpdateExperiment -> Maybe Text
$sel:samplingRate:UpdateExperiment' :: UpdateExperiment -> Maybe Natural
$sel:removeSegment:UpdateExperiment' :: UpdateExperiment -> Maybe Bool
$sel:randomizationSalt:UpdateExperiment' :: UpdateExperiment -> Maybe Text
$sel:onlineAbConfig:UpdateExperiment' :: UpdateExperiment -> Maybe OnlineAbConfig
$sel:metricGoals:UpdateExperiment' :: UpdateExperiment -> Maybe (NonEmpty MetricGoalConfig)
$sel:description:UpdateExperiment' :: UpdateExperiment -> Maybe Text
..} =
    forall a. Monoid a => [a] -> a
Prelude.mconcat
      [ ByteString
"/projects/",
        forall a. ToByteString a => a -> ByteString
Data.toBS Text
project,
        ByteString
"/experiments/",
        forall a. ToByteString a => a -> ByteString
Data.toBS Text
experiment
      ]

instance Data.ToQuery UpdateExperiment where
  toQuery :: UpdateExperiment -> QueryString
toQuery = forall a b. a -> b -> a
Prelude.const forall a. Monoid a => a
Prelude.mempty

-- | /See:/ 'newUpdateExperimentResponse' smart constructor.
data UpdateExperimentResponse = UpdateExperimentResponse'
  { -- | The response's http status code.
    UpdateExperimentResponse -> Int
httpStatus :: Prelude.Int,
    -- | A structure containing the configuration details of the experiment that
    -- was updated.
    UpdateExperimentResponse -> Experiment
experiment :: Experiment
  }
  deriving (UpdateExperimentResponse -> UpdateExperimentResponse -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: UpdateExperimentResponse -> UpdateExperimentResponse -> Bool
$c/= :: UpdateExperimentResponse -> UpdateExperimentResponse -> Bool
== :: UpdateExperimentResponse -> UpdateExperimentResponse -> Bool
$c== :: UpdateExperimentResponse -> UpdateExperimentResponse -> Bool
Prelude.Eq, ReadPrec [UpdateExperimentResponse]
ReadPrec UpdateExperimentResponse
Int -> ReadS UpdateExperimentResponse
ReadS [UpdateExperimentResponse]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [UpdateExperimentResponse]
$creadListPrec :: ReadPrec [UpdateExperimentResponse]
readPrec :: ReadPrec UpdateExperimentResponse
$creadPrec :: ReadPrec UpdateExperimentResponse
readList :: ReadS [UpdateExperimentResponse]
$creadList :: ReadS [UpdateExperimentResponse]
readsPrec :: Int -> ReadS UpdateExperimentResponse
$creadsPrec :: Int -> ReadS UpdateExperimentResponse
Prelude.Read, Int -> UpdateExperimentResponse -> ShowS
[UpdateExperimentResponse] -> ShowS
UpdateExperimentResponse -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [UpdateExperimentResponse] -> ShowS
$cshowList :: [UpdateExperimentResponse] -> ShowS
show :: UpdateExperimentResponse -> String
$cshow :: UpdateExperimentResponse -> String
showsPrec :: Int -> UpdateExperimentResponse -> ShowS
$cshowsPrec :: Int -> UpdateExperimentResponse -> ShowS
Prelude.Show, forall x.
Rep UpdateExperimentResponse x -> UpdateExperimentResponse
forall x.
UpdateExperimentResponse -> Rep UpdateExperimentResponse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x.
Rep UpdateExperimentResponse x -> UpdateExperimentResponse
$cfrom :: forall x.
UpdateExperimentResponse -> Rep UpdateExperimentResponse x
Prelude.Generic)

-- |
-- Create a value of 'UpdateExperimentResponse' with all optional fields omitted.
--
-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
--
-- The following record fields are available, with the corresponding lenses provided
-- for backwards compatibility:
--
-- 'httpStatus', 'updateExperimentResponse_httpStatus' - The response's http status code.
--
-- 'experiment', 'updateExperimentResponse_experiment' - A structure containing the configuration details of the experiment that
-- was updated.
newUpdateExperimentResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  -- | 'experiment'
  Experiment ->
  UpdateExperimentResponse
newUpdateExperimentResponse :: Int -> Experiment -> UpdateExperimentResponse
newUpdateExperimentResponse Int
pHttpStatus_ Experiment
pExperiment_ =
  UpdateExperimentResponse'
    { $sel:httpStatus:UpdateExperimentResponse' :: Int
httpStatus =
        Int
pHttpStatus_,
      $sel:experiment:UpdateExperimentResponse' :: Experiment
experiment = Experiment
pExperiment_
    }

-- | The response's http status code.
updateExperimentResponse_httpStatus :: Lens.Lens' UpdateExperimentResponse Prelude.Int
updateExperimentResponse_httpStatus :: Lens' UpdateExperimentResponse Int
updateExperimentResponse_httpStatus = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\UpdateExperimentResponse' {Int
httpStatus :: Int
$sel:httpStatus:UpdateExperimentResponse' :: UpdateExperimentResponse -> Int
httpStatus} -> Int
httpStatus) (\s :: UpdateExperimentResponse
s@UpdateExperimentResponse' {} Int
a -> UpdateExperimentResponse
s {$sel:httpStatus:UpdateExperimentResponse' :: Int
httpStatus = Int
a} :: UpdateExperimentResponse)

-- | A structure containing the configuration details of the experiment that
-- was updated.
updateExperimentResponse_experiment :: Lens.Lens' UpdateExperimentResponse Experiment
updateExperimentResponse_experiment :: Lens' UpdateExperimentResponse Experiment
updateExperimentResponse_experiment = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\UpdateExperimentResponse' {Experiment
experiment :: Experiment
$sel:experiment:UpdateExperimentResponse' :: UpdateExperimentResponse -> Experiment
experiment} -> Experiment
experiment) (\s :: UpdateExperimentResponse
s@UpdateExperimentResponse' {} Experiment
a -> UpdateExperimentResponse
s {$sel:experiment:UpdateExperimentResponse' :: Experiment
experiment = Experiment
a} :: UpdateExperimentResponse)

instance Prelude.NFData UpdateExperimentResponse where
  rnf :: UpdateExperimentResponse -> ()
rnf UpdateExperimentResponse' {Int
Experiment
experiment :: Experiment
httpStatus :: Int
$sel:experiment:UpdateExperimentResponse' :: UpdateExperimentResponse -> Experiment
$sel:httpStatus:UpdateExperimentResponse' :: UpdateExperimentResponse -> Int
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Int
httpStatus
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Experiment
experiment