{-# 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.QuickSight.Types.Filter
-- 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.QuickSight.Types.Filter where

import qualified Amazonka.Core as Core
import qualified Amazonka.Core.Lens.Internal as Lens
import qualified Amazonka.Data as Data
import qualified Amazonka.Prelude as Prelude
import Amazonka.QuickSight.Types.CategoryFilter
import Amazonka.QuickSight.Types.NumericEqualityFilter
import Amazonka.QuickSight.Types.NumericRangeFilter
import Amazonka.QuickSight.Types.RelativeDatesFilter
import Amazonka.QuickSight.Types.TimeEqualityFilter
import Amazonka.QuickSight.Types.TimeRangeFilter
import Amazonka.QuickSight.Types.TopBottomFilter

-- | With a @Filter@, you can remove portions of data from a particular
-- visual or view.
--
-- This is a union type structure. For this structure to be valid, only one
-- of the attributes can be defined.
--
-- /See:/ 'newFilter' smart constructor.
data Filter = Filter'
  { -- | A @CategoryFilter@ filters text values.
    --
    -- For more information, see
    -- <https://docs.aws.amazon.com/quicksight/latest/user/add-a-text-filter-data-prep.html Adding text filters>
    -- in the /Amazon QuickSight User Guide/.
    Filter -> Maybe CategoryFilter
categoryFilter :: Prelude.Maybe CategoryFilter,
    -- | A @NumericEqualityFilter@ filters numeric values that equal or do not
    -- equal a given numeric value.
    Filter -> Maybe NumericEqualityFilter
numericEqualityFilter :: Prelude.Maybe NumericEqualityFilter,
    -- | A @NumericRangeFilter@ filters numeric values that are either inside or
    -- outside a given numeric range.
    Filter -> Maybe NumericRangeFilter
numericRangeFilter :: Prelude.Maybe NumericRangeFilter,
    -- | A @RelativeDatesFilter@ filters date values that are relative to a given
    -- date.
    Filter -> Maybe RelativeDatesFilter
relativeDatesFilter :: Prelude.Maybe RelativeDatesFilter,
    -- | A @TimeEqualityFilter@ filters date-time values that equal or do not
    -- equal a given date\/time value.
    Filter -> Maybe TimeEqualityFilter
timeEqualityFilter :: Prelude.Maybe TimeEqualityFilter,
    -- | A @TimeRangeFilter@ filters date-time values that are either inside or
    -- outside a given date\/time range.
    Filter -> Maybe TimeRangeFilter
timeRangeFilter :: Prelude.Maybe TimeRangeFilter,
    -- | A @TopBottomFilter@ filters data to the top or bottom values for a given
    -- column.
    Filter -> Maybe TopBottomFilter
topBottomFilter :: Prelude.Maybe TopBottomFilter
  }
  deriving (Filter -> Filter -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Filter -> Filter -> Bool
$c/= :: Filter -> Filter -> Bool
== :: Filter -> Filter -> Bool
$c== :: Filter -> Filter -> Bool
Prelude.Eq, Int -> Filter -> ShowS
[Filter] -> ShowS
Filter -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Filter] -> ShowS
$cshowList :: [Filter] -> ShowS
show :: Filter -> String
$cshow :: Filter -> String
showsPrec :: Int -> Filter -> ShowS
$cshowsPrec :: Int -> Filter -> ShowS
Prelude.Show, forall x. Rep Filter x -> Filter
forall x. Filter -> Rep Filter x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Filter x -> Filter
$cfrom :: forall x. Filter -> Rep Filter x
Prelude.Generic)

-- |
-- Create a value of 'Filter' 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:
--
-- 'categoryFilter', 'filter_categoryFilter' - A @CategoryFilter@ filters text values.
--
-- For more information, see
-- <https://docs.aws.amazon.com/quicksight/latest/user/add-a-text-filter-data-prep.html Adding text filters>
-- in the /Amazon QuickSight User Guide/.
--
-- 'numericEqualityFilter', 'filter_numericEqualityFilter' - A @NumericEqualityFilter@ filters numeric values that equal or do not
-- equal a given numeric value.
--
-- 'numericRangeFilter', 'filter_numericRangeFilter' - A @NumericRangeFilter@ filters numeric values that are either inside or
-- outside a given numeric range.
--
-- 'relativeDatesFilter', 'filter_relativeDatesFilter' - A @RelativeDatesFilter@ filters date values that are relative to a given
-- date.
--
-- 'timeEqualityFilter', 'filter_timeEqualityFilter' - A @TimeEqualityFilter@ filters date-time values that equal or do not
-- equal a given date\/time value.
--
-- 'timeRangeFilter', 'filter_timeRangeFilter' - A @TimeRangeFilter@ filters date-time values that are either inside or
-- outside a given date\/time range.
--
-- 'topBottomFilter', 'filter_topBottomFilter' - A @TopBottomFilter@ filters data to the top or bottom values for a given
-- column.
newFilter ::
  Filter
newFilter :: Filter
newFilter =
  Filter'
    { $sel:categoryFilter:Filter' :: Maybe CategoryFilter
categoryFilter = forall a. Maybe a
Prelude.Nothing,
      $sel:numericEqualityFilter:Filter' :: Maybe NumericEqualityFilter
numericEqualityFilter = forall a. Maybe a
Prelude.Nothing,
      $sel:numericRangeFilter:Filter' :: Maybe NumericRangeFilter
numericRangeFilter = forall a. Maybe a
Prelude.Nothing,
      $sel:relativeDatesFilter:Filter' :: Maybe RelativeDatesFilter
relativeDatesFilter = forall a. Maybe a
Prelude.Nothing,
      $sel:timeEqualityFilter:Filter' :: Maybe TimeEqualityFilter
timeEqualityFilter = forall a. Maybe a
Prelude.Nothing,
      $sel:timeRangeFilter:Filter' :: Maybe TimeRangeFilter
timeRangeFilter = forall a. Maybe a
Prelude.Nothing,
      $sel:topBottomFilter:Filter' :: Maybe TopBottomFilter
topBottomFilter = forall a. Maybe a
Prelude.Nothing
    }

-- | A @CategoryFilter@ filters text values.
--
-- For more information, see
-- <https://docs.aws.amazon.com/quicksight/latest/user/add-a-text-filter-data-prep.html Adding text filters>
-- in the /Amazon QuickSight User Guide/.
filter_categoryFilter :: Lens.Lens' Filter (Prelude.Maybe CategoryFilter)
filter_categoryFilter :: Lens' Filter (Maybe CategoryFilter)
filter_categoryFilter = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Filter' {Maybe CategoryFilter
categoryFilter :: Maybe CategoryFilter
$sel:categoryFilter:Filter' :: Filter -> Maybe CategoryFilter
categoryFilter} -> Maybe CategoryFilter
categoryFilter) (\s :: Filter
s@Filter' {} Maybe CategoryFilter
a -> Filter
s {$sel:categoryFilter:Filter' :: Maybe CategoryFilter
categoryFilter = Maybe CategoryFilter
a} :: Filter)

-- | A @NumericEqualityFilter@ filters numeric values that equal or do not
-- equal a given numeric value.
filter_numericEqualityFilter :: Lens.Lens' Filter (Prelude.Maybe NumericEqualityFilter)
filter_numericEqualityFilter :: Lens' Filter (Maybe NumericEqualityFilter)
filter_numericEqualityFilter = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Filter' {Maybe NumericEqualityFilter
numericEqualityFilter :: Maybe NumericEqualityFilter
$sel:numericEqualityFilter:Filter' :: Filter -> Maybe NumericEqualityFilter
numericEqualityFilter} -> Maybe NumericEqualityFilter
numericEqualityFilter) (\s :: Filter
s@Filter' {} Maybe NumericEqualityFilter
a -> Filter
s {$sel:numericEqualityFilter:Filter' :: Maybe NumericEqualityFilter
numericEqualityFilter = Maybe NumericEqualityFilter
a} :: Filter)

-- | A @NumericRangeFilter@ filters numeric values that are either inside or
-- outside a given numeric range.
filter_numericRangeFilter :: Lens.Lens' Filter (Prelude.Maybe NumericRangeFilter)
filter_numericRangeFilter :: Lens' Filter (Maybe NumericRangeFilter)
filter_numericRangeFilter = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Filter' {Maybe NumericRangeFilter
numericRangeFilter :: Maybe NumericRangeFilter
$sel:numericRangeFilter:Filter' :: Filter -> Maybe NumericRangeFilter
numericRangeFilter} -> Maybe NumericRangeFilter
numericRangeFilter) (\s :: Filter
s@Filter' {} Maybe NumericRangeFilter
a -> Filter
s {$sel:numericRangeFilter:Filter' :: Maybe NumericRangeFilter
numericRangeFilter = Maybe NumericRangeFilter
a} :: Filter)

-- | A @RelativeDatesFilter@ filters date values that are relative to a given
-- date.
filter_relativeDatesFilter :: Lens.Lens' Filter (Prelude.Maybe RelativeDatesFilter)
filter_relativeDatesFilter :: Lens' Filter (Maybe RelativeDatesFilter)
filter_relativeDatesFilter = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Filter' {Maybe RelativeDatesFilter
relativeDatesFilter :: Maybe RelativeDatesFilter
$sel:relativeDatesFilter:Filter' :: Filter -> Maybe RelativeDatesFilter
relativeDatesFilter} -> Maybe RelativeDatesFilter
relativeDatesFilter) (\s :: Filter
s@Filter' {} Maybe RelativeDatesFilter
a -> Filter
s {$sel:relativeDatesFilter:Filter' :: Maybe RelativeDatesFilter
relativeDatesFilter = Maybe RelativeDatesFilter
a} :: Filter)

-- | A @TimeEqualityFilter@ filters date-time values that equal or do not
-- equal a given date\/time value.
filter_timeEqualityFilter :: Lens.Lens' Filter (Prelude.Maybe TimeEqualityFilter)
filter_timeEqualityFilter :: Lens' Filter (Maybe TimeEqualityFilter)
filter_timeEqualityFilter = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Filter' {Maybe TimeEqualityFilter
timeEqualityFilter :: Maybe TimeEqualityFilter
$sel:timeEqualityFilter:Filter' :: Filter -> Maybe TimeEqualityFilter
timeEqualityFilter} -> Maybe TimeEqualityFilter
timeEqualityFilter) (\s :: Filter
s@Filter' {} Maybe TimeEqualityFilter
a -> Filter
s {$sel:timeEqualityFilter:Filter' :: Maybe TimeEqualityFilter
timeEqualityFilter = Maybe TimeEqualityFilter
a} :: Filter)

-- | A @TimeRangeFilter@ filters date-time values that are either inside or
-- outside a given date\/time range.
filter_timeRangeFilter :: Lens.Lens' Filter (Prelude.Maybe TimeRangeFilter)
filter_timeRangeFilter :: Lens' Filter (Maybe TimeRangeFilter)
filter_timeRangeFilter = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Filter' {Maybe TimeRangeFilter
timeRangeFilter :: Maybe TimeRangeFilter
$sel:timeRangeFilter:Filter' :: Filter -> Maybe TimeRangeFilter
timeRangeFilter} -> Maybe TimeRangeFilter
timeRangeFilter) (\s :: Filter
s@Filter' {} Maybe TimeRangeFilter
a -> Filter
s {$sel:timeRangeFilter:Filter' :: Maybe TimeRangeFilter
timeRangeFilter = Maybe TimeRangeFilter
a} :: Filter)

-- | A @TopBottomFilter@ filters data to the top or bottom values for a given
-- column.
filter_topBottomFilter :: Lens.Lens' Filter (Prelude.Maybe TopBottomFilter)
filter_topBottomFilter :: Lens' Filter (Maybe TopBottomFilter)
filter_topBottomFilter = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Filter' {Maybe TopBottomFilter
topBottomFilter :: Maybe TopBottomFilter
$sel:topBottomFilter:Filter' :: Filter -> Maybe TopBottomFilter
topBottomFilter} -> Maybe TopBottomFilter
topBottomFilter) (\s :: Filter
s@Filter' {} Maybe TopBottomFilter
a -> Filter
s {$sel:topBottomFilter:Filter' :: Maybe TopBottomFilter
topBottomFilter = Maybe TopBottomFilter
a} :: Filter)

instance Data.FromJSON Filter where
  parseJSON :: Value -> Parser Filter
parseJSON =
    forall a. String -> (Object -> Parser a) -> Value -> Parser a
Data.withObject
      String
"Filter"
      ( \Object
x ->
          Maybe CategoryFilter
-> Maybe NumericEqualityFilter
-> Maybe NumericRangeFilter
-> Maybe RelativeDatesFilter
-> Maybe TimeEqualityFilter
-> Maybe TimeRangeFilter
-> Maybe TopBottomFilter
-> Filter
Filter'
            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
"CategoryFilter")
            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
"NumericEqualityFilter")
            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
"NumericRangeFilter")
            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
"RelativeDatesFilter")
            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
"TimeEqualityFilter")
            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
"TimeRangeFilter")
            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
"TopBottomFilter")
      )

instance Prelude.Hashable Filter where
  hashWithSalt :: Int -> Filter -> Int
hashWithSalt Int
_salt Filter' {Maybe CategoryFilter
Maybe NumericRangeFilter
Maybe NumericEqualityFilter
Maybe TimeEqualityFilter
Maybe TopBottomFilter
Maybe TimeRangeFilter
Maybe RelativeDatesFilter
topBottomFilter :: Maybe TopBottomFilter
timeRangeFilter :: Maybe TimeRangeFilter
timeEqualityFilter :: Maybe TimeEqualityFilter
relativeDatesFilter :: Maybe RelativeDatesFilter
numericRangeFilter :: Maybe NumericRangeFilter
numericEqualityFilter :: Maybe NumericEqualityFilter
categoryFilter :: Maybe CategoryFilter
$sel:topBottomFilter:Filter' :: Filter -> Maybe TopBottomFilter
$sel:timeRangeFilter:Filter' :: Filter -> Maybe TimeRangeFilter
$sel:timeEqualityFilter:Filter' :: Filter -> Maybe TimeEqualityFilter
$sel:relativeDatesFilter:Filter' :: Filter -> Maybe RelativeDatesFilter
$sel:numericRangeFilter:Filter' :: Filter -> Maybe NumericRangeFilter
$sel:numericEqualityFilter:Filter' :: Filter -> Maybe NumericEqualityFilter
$sel:categoryFilter:Filter' :: Filter -> Maybe CategoryFilter
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe CategoryFilter
categoryFilter
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe NumericEqualityFilter
numericEqualityFilter
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe NumericRangeFilter
numericRangeFilter
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe RelativeDatesFilter
relativeDatesFilter
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe TimeEqualityFilter
timeEqualityFilter
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe TimeRangeFilter
timeRangeFilter
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe TopBottomFilter
topBottomFilter

instance Prelude.NFData Filter where
  rnf :: Filter -> ()
rnf Filter' {Maybe CategoryFilter
Maybe NumericRangeFilter
Maybe NumericEqualityFilter
Maybe TimeEqualityFilter
Maybe TopBottomFilter
Maybe TimeRangeFilter
Maybe RelativeDatesFilter
topBottomFilter :: Maybe TopBottomFilter
timeRangeFilter :: Maybe TimeRangeFilter
timeEqualityFilter :: Maybe TimeEqualityFilter
relativeDatesFilter :: Maybe RelativeDatesFilter
numericRangeFilter :: Maybe NumericRangeFilter
numericEqualityFilter :: Maybe NumericEqualityFilter
categoryFilter :: Maybe CategoryFilter
$sel:topBottomFilter:Filter' :: Filter -> Maybe TopBottomFilter
$sel:timeRangeFilter:Filter' :: Filter -> Maybe TimeRangeFilter
$sel:timeEqualityFilter:Filter' :: Filter -> Maybe TimeEqualityFilter
$sel:relativeDatesFilter:Filter' :: Filter -> Maybe RelativeDatesFilter
$sel:numericRangeFilter:Filter' :: Filter -> Maybe NumericRangeFilter
$sel:numericEqualityFilter:Filter' :: Filter -> Maybe NumericEqualityFilter
$sel:categoryFilter:Filter' :: Filter -> Maybe CategoryFilter
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe CategoryFilter
categoryFilter
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe NumericEqualityFilter
numericEqualityFilter
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe NumericRangeFilter
numericRangeFilter
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe RelativeDatesFilter
relativeDatesFilter
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe TimeEqualityFilter
timeEqualityFilter
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe TimeRangeFilter
timeRangeFilter
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe TopBottomFilter
topBottomFilter

instance Data.ToJSON Filter where
  toJSON :: Filter -> Value
toJSON Filter' {Maybe CategoryFilter
Maybe NumericRangeFilter
Maybe NumericEqualityFilter
Maybe TimeEqualityFilter
Maybe TopBottomFilter
Maybe TimeRangeFilter
Maybe RelativeDatesFilter
topBottomFilter :: Maybe TopBottomFilter
timeRangeFilter :: Maybe TimeRangeFilter
timeEqualityFilter :: Maybe TimeEqualityFilter
relativeDatesFilter :: Maybe RelativeDatesFilter
numericRangeFilter :: Maybe NumericRangeFilter
numericEqualityFilter :: Maybe NumericEqualityFilter
categoryFilter :: Maybe CategoryFilter
$sel:topBottomFilter:Filter' :: Filter -> Maybe TopBottomFilter
$sel:timeRangeFilter:Filter' :: Filter -> Maybe TimeRangeFilter
$sel:timeEqualityFilter:Filter' :: Filter -> Maybe TimeEqualityFilter
$sel:relativeDatesFilter:Filter' :: Filter -> Maybe RelativeDatesFilter
$sel:numericRangeFilter:Filter' :: Filter -> Maybe NumericRangeFilter
$sel:numericEqualityFilter:Filter' :: Filter -> Maybe NumericEqualityFilter
$sel:categoryFilter:Filter' :: Filter -> Maybe CategoryFilter
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ (Key
"CategoryFilter" 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 CategoryFilter
categoryFilter,
            (Key
"NumericEqualityFilter" 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 NumericEqualityFilter
numericEqualityFilter,
            (Key
"NumericRangeFilter" 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 NumericRangeFilter
numericRangeFilter,
            (Key
"RelativeDatesFilter" 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 RelativeDatesFilter
relativeDatesFilter,
            (Key
"TimeEqualityFilter" 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 TimeEqualityFilter
timeEqualityFilter,
            (Key
"TimeRangeFilter" 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 TimeRangeFilter
timeRangeFilter,
            (Key
"TopBottomFilter" 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 TopBottomFilter
topBottomFilter
          ]
      )