{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE StrictData #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# 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.Types.Experiment
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
module Amazonka.Evidently.Types.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.ExperimentExecution
import Amazonka.Evidently.Types.ExperimentSchedule
import Amazonka.Evidently.Types.ExperimentStatus
import Amazonka.Evidently.Types.ExperimentType
import Amazonka.Evidently.Types.MetricGoal
import Amazonka.Evidently.Types.OnlineAbDefinition
import Amazonka.Evidently.Types.Treatment
import qualified Amazonka.Prelude as Prelude

-- | A structure containing the configuration details of an experiment.
--
-- /See:/ 'newExperiment' smart constructor.
data Experiment = Experiment'
  { -- | A description of the experiment.
    Experiment -> Maybe Text
description :: Prelude.Maybe Prelude.Text,
    -- | A structure that contains the date and time that the experiment started
    -- and ended.
    Experiment -> Maybe ExperimentExecution
execution :: Prelude.Maybe ExperimentExecution,
    -- | 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.
    Experiment -> Maybe (NonEmpty MetricGoal)
metricGoals :: Prelude.Maybe (Prelude.NonEmpty MetricGoal),
    -- | A structure that contains the configuration of which variation to 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.
    Experiment -> Maybe OnlineAbDefinition
onlineAbDefinition :: Prelude.Maybe OnlineAbDefinition,
    -- | The name or ARN of the project that contains this experiment.
    Experiment -> Maybe Text
project :: Prelude.Maybe Prelude.Text,
    -- | This value is used when Evidently assigns a particular user session to
    -- the experiment. It helps create a randomization ID to determine which
    -- variation the user session is served. This randomization ID is a
    -- combination of the entity ID and @randomizationSalt@.
    Experiment -> Maybe Text
randomizationSalt :: Prelude.Maybe Prelude.Text,
    -- | In thousandths of a percent, the amount of the available audience that
    -- is allocated to this experiment. 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, so a value of 10,000 is
    -- 10% of the available audience.
    Experiment -> Maybe Natural
samplingRate :: Prelude.Maybe Prelude.Natural,
    -- | A structure that contains the time and date that Evidently completed the
    -- analysis of the experiment.
    Experiment -> Maybe ExperimentSchedule
schedule :: Prelude.Maybe ExperimentSchedule,
    -- | The audience segment being used for the experiment, if a segment is
    -- being used.
    Experiment -> Maybe Text
segment :: Prelude.Maybe Prelude.Text,
    -- | If the experiment was stopped, this is the string that was entered by
    -- the person who stopped the experiment, to explain why it was stopped.
    Experiment -> Maybe Text
statusReason :: Prelude.Maybe Prelude.Text,
    -- | The list of tag keys and values associated with this experiment.
    Experiment -> Maybe (HashMap Text Text)
tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
    -- | An array of structures that describe the configuration of each feature
    -- variation used in the experiment.
    Experiment -> Maybe (NonEmpty Treatment)
treatments :: Prelude.Maybe (Prelude.NonEmpty Treatment),
    -- | The ARN of the experiment.
    Experiment -> Text
arn :: Prelude.Text,
    -- | The date and time that the experiment is first created.
    Experiment -> POSIX
createdTime :: Data.POSIX,
    -- | The date and time that the experiment was most recently updated.
    Experiment -> POSIX
lastUpdatedTime :: Data.POSIX,
    -- | The name of the experiment.
    Experiment -> Text
name :: Prelude.Text,
    -- | The current state of the experiment.
    Experiment -> ExperimentStatus
status :: ExperimentStatus,
    -- | The type of this experiment. Currently, this value must be
    -- @aws.experiment.onlineab@.
    Experiment -> ExperimentType
type' :: ExperimentType
  }
  deriving (Experiment -> Experiment -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Experiment -> Experiment -> Bool
$c/= :: Experiment -> Experiment -> Bool
== :: Experiment -> Experiment -> Bool
$c== :: Experiment -> Experiment -> Bool
Prelude.Eq, ReadPrec [Experiment]
ReadPrec Experiment
Int -> ReadS Experiment
ReadS [Experiment]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [Experiment]
$creadListPrec :: ReadPrec [Experiment]
readPrec :: ReadPrec Experiment
$creadPrec :: ReadPrec Experiment
readList :: ReadS [Experiment]
$creadList :: ReadS [Experiment]
readsPrec :: Int -> ReadS Experiment
$creadsPrec :: Int -> ReadS Experiment
Prelude.Read, Int -> Experiment -> ShowS
[Experiment] -> ShowS
Experiment -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Experiment] -> ShowS
$cshowList :: [Experiment] -> ShowS
show :: Experiment -> String
$cshow :: Experiment -> String
showsPrec :: Int -> Experiment -> ShowS
$cshowsPrec :: Int -> Experiment -> ShowS
Prelude.Show, forall x. Rep Experiment x -> Experiment
forall x. Experiment -> Rep Experiment x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Experiment x -> Experiment
$cfrom :: forall x. Experiment -> Rep Experiment x
Prelude.Generic)

-- |
-- Create a value of 'Experiment' 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', 'experiment_description' - A description of the experiment.
--
-- 'execution', 'experiment_execution' - A structure that contains the date and time that the experiment started
-- and ended.
--
-- 'metricGoals', 'experiment_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.
--
-- 'onlineAbDefinition', 'experiment_onlineAbDefinition' - A structure that contains the configuration of which variation to 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.
--
-- 'project', 'experiment_project' - The name or ARN of the project that contains this experiment.
--
-- 'randomizationSalt', 'experiment_randomizationSalt' - This value is used when Evidently assigns a particular user session to
-- the experiment. It helps create a randomization ID to determine which
-- variation the user session is served. This randomization ID is a
-- combination of the entity ID and @randomizationSalt@.
--
-- 'samplingRate', 'experiment_samplingRate' - In thousandths of a percent, the amount of the available audience that
-- is allocated to this experiment. 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, so a value of 10,000 is
-- 10% of the available audience.
--
-- 'schedule', 'experiment_schedule' - A structure that contains the time and date that Evidently completed the
-- analysis of the experiment.
--
-- 'segment', 'experiment_segment' - The audience segment being used for the experiment, if a segment is
-- being used.
--
-- 'statusReason', 'experiment_statusReason' - If the experiment was stopped, this is the string that was entered by
-- the person who stopped the experiment, to explain why it was stopped.
--
-- 'tags', 'experiment_tags' - The list of tag keys and values associated with this experiment.
--
-- 'treatments', 'experiment_treatments' - An array of structures that describe the configuration of each feature
-- variation used in the experiment.
--
-- 'arn', 'experiment_arn' - The ARN of the experiment.
--
-- 'createdTime', 'experiment_createdTime' - The date and time that the experiment is first created.
--
-- 'lastUpdatedTime', 'experiment_lastUpdatedTime' - The date and time that the experiment was most recently updated.
--
-- 'name', 'experiment_name' - The name of the experiment.
--
-- 'status', 'experiment_status' - The current state of the experiment.
--
-- 'type'', 'experiment_type' - The type of this experiment. Currently, this value must be
-- @aws.experiment.onlineab@.
newExperiment ::
  -- | 'arn'
  Prelude.Text ->
  -- | 'createdTime'
  Prelude.UTCTime ->
  -- | 'lastUpdatedTime'
  Prelude.UTCTime ->
  -- | 'name'
  Prelude.Text ->
  -- | 'status'
  ExperimentStatus ->
  -- | 'type''
  ExperimentType ->
  Experiment
newExperiment :: Text
-> UTCTime
-> UTCTime
-> Text
-> ExperimentStatus
-> ExperimentType
-> Experiment
newExperiment
  Text
pArn_
  UTCTime
pCreatedTime_
  UTCTime
pLastUpdatedTime_
  Text
pName_
  ExperimentStatus
pStatus_
  ExperimentType
pType_ =
    Experiment'
      { $sel:description:Experiment' :: Maybe Text
description = forall a. Maybe a
Prelude.Nothing,
        $sel:execution:Experiment' :: Maybe ExperimentExecution
execution = forall a. Maybe a
Prelude.Nothing,
        $sel:metricGoals:Experiment' :: Maybe (NonEmpty MetricGoal)
metricGoals = forall a. Maybe a
Prelude.Nothing,
        $sel:onlineAbDefinition:Experiment' :: Maybe OnlineAbDefinition
onlineAbDefinition = forall a. Maybe a
Prelude.Nothing,
        $sel:project:Experiment' :: Maybe Text
project = forall a. Maybe a
Prelude.Nothing,
        $sel:randomizationSalt:Experiment' :: Maybe Text
randomizationSalt = forall a. Maybe a
Prelude.Nothing,
        $sel:samplingRate:Experiment' :: Maybe Natural
samplingRate = forall a. Maybe a
Prelude.Nothing,
        $sel:schedule:Experiment' :: Maybe ExperimentSchedule
schedule = forall a. Maybe a
Prelude.Nothing,
        $sel:segment:Experiment' :: Maybe Text
segment = forall a. Maybe a
Prelude.Nothing,
        $sel:statusReason:Experiment' :: Maybe Text
statusReason = forall a. Maybe a
Prelude.Nothing,
        $sel:tags:Experiment' :: Maybe (HashMap Text Text)
tags = forall a. Maybe a
Prelude.Nothing,
        $sel:treatments:Experiment' :: Maybe (NonEmpty Treatment)
treatments = forall a. Maybe a
Prelude.Nothing,
        $sel:arn:Experiment' :: Text
arn = Text
pArn_,
        $sel:createdTime:Experiment' :: POSIX
createdTime = forall (a :: Format). Iso' (Time a) UTCTime
Data._Time forall t b. AReview t b -> b -> t
Lens.# UTCTime
pCreatedTime_,
        $sel:lastUpdatedTime:Experiment' :: POSIX
lastUpdatedTime =
          forall (a :: Format). Iso' (Time a) UTCTime
Data._Time forall t b. AReview t b -> b -> t
Lens.# UTCTime
pLastUpdatedTime_,
        $sel:name:Experiment' :: Text
name = Text
pName_,
        $sel:status:Experiment' :: ExperimentStatus
status = ExperimentStatus
pStatus_,
        $sel:type':Experiment' :: ExperimentType
type' = ExperimentType
pType_
      }

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

-- | A structure that contains the date and time that the experiment started
-- and ended.
experiment_execution :: Lens.Lens' Experiment (Prelude.Maybe ExperimentExecution)
experiment_execution :: Lens' Experiment (Maybe ExperimentExecution)
experiment_execution = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Experiment' {Maybe ExperimentExecution
execution :: Maybe ExperimentExecution
$sel:execution:Experiment' :: Experiment -> Maybe ExperimentExecution
execution} -> Maybe ExperimentExecution
execution) (\s :: Experiment
s@Experiment' {} Maybe ExperimentExecution
a -> Experiment
s {$sel:execution:Experiment' :: Maybe ExperimentExecution
execution = Maybe ExperimentExecution
a} :: Experiment)

-- | 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.
experiment_metricGoals :: Lens.Lens' Experiment (Prelude.Maybe (Prelude.NonEmpty MetricGoal))
experiment_metricGoals :: Lens' Experiment (Maybe (NonEmpty MetricGoal))
experiment_metricGoals = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Experiment' {Maybe (NonEmpty MetricGoal)
metricGoals :: Maybe (NonEmpty MetricGoal)
$sel:metricGoals:Experiment' :: Experiment -> Maybe (NonEmpty MetricGoal)
metricGoals} -> Maybe (NonEmpty MetricGoal)
metricGoals) (\s :: Experiment
s@Experiment' {} Maybe (NonEmpty MetricGoal)
a -> Experiment
s {$sel:metricGoals:Experiment' :: Maybe (NonEmpty MetricGoal)
metricGoals = Maybe (NonEmpty MetricGoal)
a} :: Experiment) 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 to 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.
experiment_onlineAbDefinition :: Lens.Lens' Experiment (Prelude.Maybe OnlineAbDefinition)
experiment_onlineAbDefinition :: Lens' Experiment (Maybe OnlineAbDefinition)
experiment_onlineAbDefinition = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Experiment' {Maybe OnlineAbDefinition
onlineAbDefinition :: Maybe OnlineAbDefinition
$sel:onlineAbDefinition:Experiment' :: Experiment -> Maybe OnlineAbDefinition
onlineAbDefinition} -> Maybe OnlineAbDefinition
onlineAbDefinition) (\s :: Experiment
s@Experiment' {} Maybe OnlineAbDefinition
a -> Experiment
s {$sel:onlineAbDefinition:Experiment' :: Maybe OnlineAbDefinition
onlineAbDefinition = Maybe OnlineAbDefinition
a} :: Experiment)

-- | The name or ARN of the project that contains this experiment.
experiment_project :: Lens.Lens' Experiment (Prelude.Maybe Prelude.Text)
experiment_project :: Lens' Experiment (Maybe Text)
experiment_project = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Experiment' {Maybe Text
project :: Maybe Text
$sel:project:Experiment' :: Experiment -> Maybe Text
project} -> Maybe Text
project) (\s :: Experiment
s@Experiment' {} Maybe Text
a -> Experiment
s {$sel:project:Experiment' :: Maybe Text
project = Maybe Text
a} :: Experiment)

-- | This value is used when Evidently assigns a particular user session to
-- the experiment. It helps create a randomization ID to determine which
-- variation the user session is served. This randomization ID is a
-- combination of the entity ID and @randomizationSalt@.
experiment_randomizationSalt :: Lens.Lens' Experiment (Prelude.Maybe Prelude.Text)
experiment_randomizationSalt :: Lens' Experiment (Maybe Text)
experiment_randomizationSalt = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Experiment' {Maybe Text
randomizationSalt :: Maybe Text
$sel:randomizationSalt:Experiment' :: Experiment -> Maybe Text
randomizationSalt} -> Maybe Text
randomizationSalt) (\s :: Experiment
s@Experiment' {} Maybe Text
a -> Experiment
s {$sel:randomizationSalt:Experiment' :: Maybe Text
randomizationSalt = Maybe Text
a} :: Experiment)

-- | In thousandths of a percent, the amount of the available audience that
-- is allocated to this experiment. 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, so a value of 10,000 is
-- 10% of the available audience.
experiment_samplingRate :: Lens.Lens' Experiment (Prelude.Maybe Prelude.Natural)
experiment_samplingRate :: Lens' Experiment (Maybe Natural)
experiment_samplingRate = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Experiment' {Maybe Natural
samplingRate :: Maybe Natural
$sel:samplingRate:Experiment' :: Experiment -> Maybe Natural
samplingRate} -> Maybe Natural
samplingRate) (\s :: Experiment
s@Experiment' {} Maybe Natural
a -> Experiment
s {$sel:samplingRate:Experiment' :: Maybe Natural
samplingRate = Maybe Natural
a} :: Experiment)

-- | A structure that contains the time and date that Evidently completed the
-- analysis of the experiment.
experiment_schedule :: Lens.Lens' Experiment (Prelude.Maybe ExperimentSchedule)
experiment_schedule :: Lens' Experiment (Maybe ExperimentSchedule)
experiment_schedule = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Experiment' {Maybe ExperimentSchedule
schedule :: Maybe ExperimentSchedule
$sel:schedule:Experiment' :: Experiment -> Maybe ExperimentSchedule
schedule} -> Maybe ExperimentSchedule
schedule) (\s :: Experiment
s@Experiment' {} Maybe ExperimentSchedule
a -> Experiment
s {$sel:schedule:Experiment' :: Maybe ExperimentSchedule
schedule = Maybe ExperimentSchedule
a} :: Experiment)

-- | The audience segment being used for the experiment, if a segment is
-- being used.
experiment_segment :: Lens.Lens' Experiment (Prelude.Maybe Prelude.Text)
experiment_segment :: Lens' Experiment (Maybe Text)
experiment_segment = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Experiment' {Maybe Text
segment :: Maybe Text
$sel:segment:Experiment' :: Experiment -> Maybe Text
segment} -> Maybe Text
segment) (\s :: Experiment
s@Experiment' {} Maybe Text
a -> Experiment
s {$sel:segment:Experiment' :: Maybe Text
segment = Maybe Text
a} :: Experiment)

-- | If the experiment was stopped, this is the string that was entered by
-- the person who stopped the experiment, to explain why it was stopped.
experiment_statusReason :: Lens.Lens' Experiment (Prelude.Maybe Prelude.Text)
experiment_statusReason :: Lens' Experiment (Maybe Text)
experiment_statusReason = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Experiment' {Maybe Text
statusReason :: Maybe Text
$sel:statusReason:Experiment' :: Experiment -> Maybe Text
statusReason} -> Maybe Text
statusReason) (\s :: Experiment
s@Experiment' {} Maybe Text
a -> Experiment
s {$sel:statusReason:Experiment' :: Maybe Text
statusReason = Maybe Text
a} :: Experiment)

-- | The list of tag keys and values associated with this experiment.
experiment_tags :: Lens.Lens' Experiment (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
experiment_tags :: Lens' Experiment (Maybe (HashMap Text Text))
experiment_tags = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Experiment' {Maybe (HashMap Text Text)
tags :: Maybe (HashMap Text Text)
$sel:tags:Experiment' :: Experiment -> Maybe (HashMap Text Text)
tags} -> Maybe (HashMap Text Text)
tags) (\s :: Experiment
s@Experiment' {} Maybe (HashMap Text Text)
a -> Experiment
s {$sel:tags:Experiment' :: Maybe (HashMap Text Text)
tags = Maybe (HashMap Text Text)
a} :: Experiment) 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

-- | An array of structures that describe the configuration of each feature
-- variation used in the experiment.
experiment_treatments :: Lens.Lens' Experiment (Prelude.Maybe (Prelude.NonEmpty Treatment))
experiment_treatments :: Lens' Experiment (Maybe (NonEmpty Treatment))
experiment_treatments = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Experiment' {Maybe (NonEmpty Treatment)
treatments :: Maybe (NonEmpty Treatment)
$sel:treatments:Experiment' :: Experiment -> Maybe (NonEmpty Treatment)
treatments} -> Maybe (NonEmpty Treatment)
treatments) (\s :: Experiment
s@Experiment' {} Maybe (NonEmpty Treatment)
a -> Experiment
s {$sel:treatments:Experiment' :: Maybe (NonEmpty Treatment)
treatments = Maybe (NonEmpty Treatment)
a} :: Experiment) 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 ARN of the experiment.
experiment_arn :: Lens.Lens' Experiment Prelude.Text
experiment_arn :: Lens' Experiment Text
experiment_arn = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Experiment' {Text
arn :: Text
$sel:arn:Experiment' :: Experiment -> Text
arn} -> Text
arn) (\s :: Experiment
s@Experiment' {} Text
a -> Experiment
s {$sel:arn:Experiment' :: Text
arn = Text
a} :: Experiment)

-- | The date and time that the experiment is first created.
experiment_createdTime :: Lens.Lens' Experiment Prelude.UTCTime
experiment_createdTime :: Lens' Experiment UTCTime
experiment_createdTime = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Experiment' {POSIX
createdTime :: POSIX
$sel:createdTime:Experiment' :: Experiment -> POSIX
createdTime} -> POSIX
createdTime) (\s :: Experiment
s@Experiment' {} POSIX
a -> Experiment
s {$sel:createdTime:Experiment' :: POSIX
createdTime = POSIX
a} :: Experiment) forall b c a. (b -> c) -> (a -> b) -> a -> c
Prelude.. forall (a :: Format). Iso' (Time a) UTCTime
Data._Time

-- | The date and time that the experiment was most recently updated.
experiment_lastUpdatedTime :: Lens.Lens' Experiment Prelude.UTCTime
experiment_lastUpdatedTime :: Lens' Experiment UTCTime
experiment_lastUpdatedTime = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Experiment' {POSIX
lastUpdatedTime :: POSIX
$sel:lastUpdatedTime:Experiment' :: Experiment -> POSIX
lastUpdatedTime} -> POSIX
lastUpdatedTime) (\s :: Experiment
s@Experiment' {} POSIX
a -> Experiment
s {$sel:lastUpdatedTime:Experiment' :: POSIX
lastUpdatedTime = POSIX
a} :: Experiment) forall b c a. (b -> c) -> (a -> b) -> a -> c
Prelude.. forall (a :: Format). Iso' (Time a) UTCTime
Data._Time

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

-- | The current state of the experiment.
experiment_status :: Lens.Lens' Experiment ExperimentStatus
experiment_status :: Lens' Experiment ExperimentStatus
experiment_status = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Experiment' {ExperimentStatus
status :: ExperimentStatus
$sel:status:Experiment' :: Experiment -> ExperimentStatus
status} -> ExperimentStatus
status) (\s :: Experiment
s@Experiment' {} ExperimentStatus
a -> Experiment
s {$sel:status:Experiment' :: ExperimentStatus
status = ExperimentStatus
a} :: Experiment)

-- | The type of this experiment. Currently, this value must be
-- @aws.experiment.onlineab@.
experiment_type :: Lens.Lens' Experiment ExperimentType
experiment_type :: Lens' Experiment ExperimentType
experiment_type = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Experiment' {ExperimentType
type' :: ExperimentType
$sel:type':Experiment' :: Experiment -> ExperimentType
type'} -> ExperimentType
type') (\s :: Experiment
s@Experiment' {} ExperimentType
a -> Experiment
s {$sel:type':Experiment' :: ExperimentType
type' = ExperimentType
a} :: Experiment)

instance Data.FromJSON Experiment where
  parseJSON :: Value -> Parser Experiment
parseJSON =
    forall a. String -> (Object -> Parser a) -> Value -> Parser a
Data.withObject
      String
"Experiment"
      ( \Object
x ->
          Maybe Text
-> Maybe ExperimentExecution
-> Maybe (NonEmpty MetricGoal)
-> Maybe OnlineAbDefinition
-> Maybe Text
-> Maybe Text
-> Maybe Natural
-> Maybe ExperimentSchedule
-> Maybe Text
-> Maybe Text
-> Maybe (HashMap Text Text)
-> Maybe (NonEmpty Treatment)
-> Text
-> POSIX
-> POSIX
-> Text
-> ExperimentStatus
-> ExperimentType
-> Experiment
Experiment'
            forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"description")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"execution")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"metricGoals")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"onlineAbDefinition")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"project")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"randomizationSalt")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"samplingRate")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"schedule")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"segment")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"statusReason")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"tags" forall a. Parser (Maybe a) -> a -> Parser a
Data..!= forall a. Monoid a => a
Prelude.mempty)
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"treatments")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser a
Data..: Key
"arn")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser a
Data..: Key
"createdTime")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser a
Data..: Key
"lastUpdatedTime")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser a
Data..: Key
"name")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser a
Data..: Key
"status")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser a
Data..: Key
"type")
      )

instance Prelude.Hashable Experiment where
  hashWithSalt :: Int -> Experiment -> Int
hashWithSalt Int
_salt Experiment' {Maybe Natural
Maybe (NonEmpty MetricGoal)
Maybe (NonEmpty Treatment)
Maybe Text
Maybe (HashMap Text Text)
Maybe ExperimentExecution
Maybe ExperimentSchedule
Maybe OnlineAbDefinition
Text
POSIX
ExperimentStatus
ExperimentType
type' :: ExperimentType
status :: ExperimentStatus
name :: Text
lastUpdatedTime :: POSIX
createdTime :: POSIX
arn :: Text
treatments :: Maybe (NonEmpty Treatment)
tags :: Maybe (HashMap Text Text)
statusReason :: Maybe Text
segment :: Maybe Text
schedule :: Maybe ExperimentSchedule
samplingRate :: Maybe Natural
randomizationSalt :: Maybe Text
project :: Maybe Text
onlineAbDefinition :: Maybe OnlineAbDefinition
metricGoals :: Maybe (NonEmpty MetricGoal)
execution :: Maybe ExperimentExecution
description :: Maybe Text
$sel:type':Experiment' :: Experiment -> ExperimentType
$sel:status:Experiment' :: Experiment -> ExperimentStatus
$sel:name:Experiment' :: Experiment -> Text
$sel:lastUpdatedTime:Experiment' :: Experiment -> POSIX
$sel:createdTime:Experiment' :: Experiment -> POSIX
$sel:arn:Experiment' :: Experiment -> Text
$sel:treatments:Experiment' :: Experiment -> Maybe (NonEmpty Treatment)
$sel:tags:Experiment' :: Experiment -> Maybe (HashMap Text Text)
$sel:statusReason:Experiment' :: Experiment -> Maybe Text
$sel:segment:Experiment' :: Experiment -> Maybe Text
$sel:schedule:Experiment' :: Experiment -> Maybe ExperimentSchedule
$sel:samplingRate:Experiment' :: Experiment -> Maybe Natural
$sel:randomizationSalt:Experiment' :: Experiment -> Maybe Text
$sel:project:Experiment' :: Experiment -> Maybe Text
$sel:onlineAbDefinition:Experiment' :: Experiment -> Maybe OnlineAbDefinition
$sel:metricGoals:Experiment' :: Experiment -> Maybe (NonEmpty MetricGoal)
$sel:execution:Experiment' :: Experiment -> Maybe ExperimentExecution
$sel:description:Experiment' :: Experiment -> 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 ExperimentExecution
execution
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe (NonEmpty MetricGoal)
metricGoals
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe OnlineAbDefinition
onlineAbDefinition
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Text
project
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Text
randomizationSalt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Natural
samplingRate
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe ExperimentSchedule
schedule
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Text
segment
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Text
statusReason
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe (HashMap Text Text)
tags
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe (NonEmpty Treatment)
treatments
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
arn
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` POSIX
createdTime
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` POSIX
lastUpdatedTime
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
name
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` ExperimentStatus
status
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` ExperimentType
type'

instance Prelude.NFData Experiment where
  rnf :: Experiment -> ()
rnf Experiment' {Maybe Natural
Maybe (NonEmpty MetricGoal)
Maybe (NonEmpty Treatment)
Maybe Text
Maybe (HashMap Text Text)
Maybe ExperimentExecution
Maybe ExperimentSchedule
Maybe OnlineAbDefinition
Text
POSIX
ExperimentStatus
ExperimentType
type' :: ExperimentType
status :: ExperimentStatus
name :: Text
lastUpdatedTime :: POSIX
createdTime :: POSIX
arn :: Text
treatments :: Maybe (NonEmpty Treatment)
tags :: Maybe (HashMap Text Text)
statusReason :: Maybe Text
segment :: Maybe Text
schedule :: Maybe ExperimentSchedule
samplingRate :: Maybe Natural
randomizationSalt :: Maybe Text
project :: Maybe Text
onlineAbDefinition :: Maybe OnlineAbDefinition
metricGoals :: Maybe (NonEmpty MetricGoal)
execution :: Maybe ExperimentExecution
description :: Maybe Text
$sel:type':Experiment' :: Experiment -> ExperimentType
$sel:status:Experiment' :: Experiment -> ExperimentStatus
$sel:name:Experiment' :: Experiment -> Text
$sel:lastUpdatedTime:Experiment' :: Experiment -> POSIX
$sel:createdTime:Experiment' :: Experiment -> POSIX
$sel:arn:Experiment' :: Experiment -> Text
$sel:treatments:Experiment' :: Experiment -> Maybe (NonEmpty Treatment)
$sel:tags:Experiment' :: Experiment -> Maybe (HashMap Text Text)
$sel:statusReason:Experiment' :: Experiment -> Maybe Text
$sel:segment:Experiment' :: Experiment -> Maybe Text
$sel:schedule:Experiment' :: Experiment -> Maybe ExperimentSchedule
$sel:samplingRate:Experiment' :: Experiment -> Maybe Natural
$sel:randomizationSalt:Experiment' :: Experiment -> Maybe Text
$sel:project:Experiment' :: Experiment -> Maybe Text
$sel:onlineAbDefinition:Experiment' :: Experiment -> Maybe OnlineAbDefinition
$sel:metricGoals:Experiment' :: Experiment -> Maybe (NonEmpty MetricGoal)
$sel:execution:Experiment' :: Experiment -> Maybe ExperimentExecution
$sel:description:Experiment' :: Experiment -> 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 ExperimentExecution
execution
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe (NonEmpty MetricGoal)
metricGoals
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe OnlineAbDefinition
onlineAbDefinition
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
project
      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 Natural
samplingRate
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe ExperimentSchedule
schedule
      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 Text
statusReason
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe (HashMap Text Text)
tags
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe (NonEmpty Treatment)
treatments
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
arn
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf POSIX
createdTime
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf POSIX
lastUpdatedTime
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
name
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf ExperimentStatus
status
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf ExperimentType
type'