{-# LANGUAGE GeneralizedNewtypeDeriving #-}

-- This file is part of the Wire Server implementation.
--
-- Copyright (C) 2022 Wire Swiss GmbH <opensource@wire.com>
--
-- This program is free software: you can redistribute it and/or modify it under
-- the terms of the GNU Affero General Public License as published by the Free
-- Software Foundation, either version 3 of the License, or (at your option) any
-- later version.
--
-- This program is distributed in the hope that it will be useful, but WITHOUT
-- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-- FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
-- details.
--
-- You should have received a copy of the GNU Affero General Public License along
-- with this program. If not, see <https://www.gnu.org/licenses/>.

module Wire.API.UserMap where

import Control.Lens ((?~), (^.))
import Data.Aeson (FromJSON, ToJSON (toJSON))
import Data.Domain (Domain)
import Data.Id (UserId)
import Data.Map qualified as Map
import Data.OpenApi (HasDescription (description), HasExample (example), NamedSchema (..), ToSchema (..), declareSchema, toSchema)
import Data.Proxy (Proxy (..))
import Data.Set qualified as Set
import Data.Text qualified as Text
import Data.Typeable (typeRep)
import Imports
import Test.QuickCheck (Arbitrary (..))
import Wire.API.Wrapped (Wrapped)
import Wire.Arbitrary (generateExample, mapOf')

newtype UserMap a = UserMap {forall a. UserMap a -> Map UserId a
userMap :: Map UserId a}
  deriving stock (UserMap a -> UserMap a -> Bool
(UserMap a -> UserMap a -> Bool)
-> (UserMap a -> UserMap a -> Bool) -> Eq (UserMap a)
forall a. Eq a => UserMap a -> UserMap a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall a. Eq a => UserMap a -> UserMap a -> Bool
== :: UserMap a -> UserMap a -> Bool
$c/= :: forall a. Eq a => UserMap a -> UserMap a -> Bool
/= :: UserMap a -> UserMap a -> Bool
Eq, Int -> UserMap a -> ShowS
[UserMap a] -> ShowS
UserMap a -> String
(Int -> UserMap a -> ShowS)
-> (UserMap a -> String)
-> ([UserMap a] -> ShowS)
-> Show (UserMap a)
forall a. Show a => Int -> UserMap a -> ShowS
forall a. Show a => [UserMap a] -> ShowS
forall a. Show a => UserMap a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall a. Show a => Int -> UserMap a -> ShowS
showsPrec :: Int -> UserMap a -> ShowS
$cshow :: forall a. Show a => UserMap a -> String
show :: UserMap a -> String
$cshowList :: forall a. Show a => [UserMap a] -> ShowS
showList :: [UserMap a] -> ShowS
Show)
  deriving newtype (NonEmpty (UserMap a) -> UserMap a
UserMap a -> UserMap a -> UserMap a
(UserMap a -> UserMap a -> UserMap a)
-> (NonEmpty (UserMap a) -> UserMap a)
-> (forall b. Integral b => b -> UserMap a -> UserMap a)
-> Semigroup (UserMap a)
forall b. Integral b => b -> UserMap a -> UserMap a
forall a. NonEmpty (UserMap a) -> UserMap a
forall a. UserMap a -> UserMap a -> UserMap a
forall a.
(a -> a -> a)
-> (NonEmpty a -> a)
-> (forall b. Integral b => b -> a -> a)
-> Semigroup a
forall a b. Integral b => b -> UserMap a -> UserMap a
$c<> :: forall a. UserMap a -> UserMap a -> UserMap a
<> :: UserMap a -> UserMap a -> UserMap a
$csconcat :: forall a. NonEmpty (UserMap a) -> UserMap a
sconcat :: NonEmpty (UserMap a) -> UserMap a
$cstimes :: forall a b. Integral b => b -> UserMap a -> UserMap a
stimes :: forall b. Integral b => b -> UserMap a -> UserMap a
Semigroup, Semigroup (UserMap a)
UserMap a
Semigroup (UserMap a) =>
UserMap a
-> (UserMap a -> UserMap a -> UserMap a)
-> ([UserMap a] -> UserMap a)
-> Monoid (UserMap a)
[UserMap a] -> UserMap a
UserMap a -> UserMap a -> UserMap a
forall a. Semigroup (UserMap a)
forall a. UserMap a
forall a.
Semigroup a =>
a -> (a -> a -> a) -> ([a] -> a) -> Monoid a
forall a. [UserMap a] -> UserMap a
forall a. UserMap a -> UserMap a -> UserMap a
$cmempty :: forall a. UserMap a
mempty :: UserMap a
$cmappend :: forall a. UserMap a -> UserMap a -> UserMap a
mappend :: UserMap a -> UserMap a -> UserMap a
$cmconcat :: forall a. [UserMap a] -> UserMap a
mconcat :: [UserMap a] -> UserMap a
Monoid, [UserMap a] -> Value
[UserMap a] -> Encoding
UserMap a -> Value
UserMap a -> Encoding
(UserMap a -> Value)
-> (UserMap a -> Encoding)
-> ([UserMap a] -> Value)
-> ([UserMap a] -> Encoding)
-> ToJSON (UserMap a)
forall a. ToJSON a => [UserMap a] -> Value
forall a. ToJSON a => [UserMap a] -> Encoding
forall a. ToJSON a => UserMap a -> Value
forall a. ToJSON a => UserMap a -> Encoding
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
$ctoJSON :: forall a. ToJSON a => UserMap a -> Value
toJSON :: UserMap a -> Value
$ctoEncoding :: forall a. ToJSON a => UserMap a -> Encoding
toEncoding :: UserMap a -> Encoding
$ctoJSONList :: forall a. ToJSON a => [UserMap a] -> Value
toJSONList :: [UserMap a] -> Value
$ctoEncodingList :: forall a. ToJSON a => [UserMap a] -> Encoding
toEncodingList :: [UserMap a] -> Encoding
ToJSON, Value -> Parser [UserMap a]
Value -> Parser (UserMap a)
(Value -> Parser (UserMap a))
-> (Value -> Parser [UserMap a]) -> FromJSON (UserMap a)
forall a. FromJSON a => Value -> Parser [UserMap a]
forall a. FromJSON a => Value -> Parser (UserMap a)
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
$cparseJSON :: forall a. FromJSON a => Value -> Parser (UserMap a)
parseJSON :: Value -> Parser (UserMap a)
$cparseJSONList :: forall a. FromJSON a => Value -> Parser [UserMap a]
parseJSONList :: Value -> Parser [UserMap a]
FromJSON, (forall a b. (a -> b) -> UserMap a -> UserMap b)
-> (forall a b. a -> UserMap b -> UserMap a) -> Functor UserMap
forall a b. a -> UserMap b -> UserMap a
forall a b. (a -> b) -> UserMap a -> UserMap b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
$cfmap :: forall a b. (a -> b) -> UserMap a -> UserMap b
fmap :: forall a b. (a -> b) -> UserMap a -> UserMap b
$c<$ :: forall a b. a -> UserMap b -> UserMap a
<$ :: forall a b. a -> UserMap b -> UserMap a
Functor)

instance (Arbitrary a) => Arbitrary (UserMap a) where
  arbitrary :: Gen (UserMap a)
arbitrary = Map UserId a -> UserMap a
forall a. Map UserId a -> UserMap a
UserMap (Map UserId a -> UserMap a)
-> Gen (Map UserId a) -> Gen (UserMap a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen UserId -> Gen a -> Gen (Map UserId a)
forall k v. Ord k => Gen k -> Gen v -> Gen (Map k v)
mapOf' Gen UserId
forall a. Arbitrary a => Gen a
arbitrary Gen a
forall a. Arbitrary a => Gen a
arbitrary

type WrappedQualifiedUserMap a = Wrapped "qualified_user_map" (QualifiedUserMap a)

newtype QualifiedUserMap a = QualifiedUserMap
  { forall a. QualifiedUserMap a -> Map Domain (UserMap a)
qualifiedUserMap :: Map Domain (UserMap a)
  }
  deriving stock (QualifiedUserMap a -> QualifiedUserMap a -> Bool
(QualifiedUserMap a -> QualifiedUserMap a -> Bool)
-> (QualifiedUserMap a -> QualifiedUserMap a -> Bool)
-> Eq (QualifiedUserMap a)
forall a. Eq a => QualifiedUserMap a -> QualifiedUserMap a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall a. Eq a => QualifiedUserMap a -> QualifiedUserMap a -> Bool
== :: QualifiedUserMap a -> QualifiedUserMap a -> Bool
$c/= :: forall a. Eq a => QualifiedUserMap a -> QualifiedUserMap a -> Bool
/= :: QualifiedUserMap a -> QualifiedUserMap a -> Bool
Eq, Int -> QualifiedUserMap a -> ShowS
[QualifiedUserMap a] -> ShowS
QualifiedUserMap a -> String
(Int -> QualifiedUserMap a -> ShowS)
-> (QualifiedUserMap a -> String)
-> ([QualifiedUserMap a] -> ShowS)
-> Show (QualifiedUserMap a)
forall a. Show a => Int -> QualifiedUserMap a -> ShowS
forall a. Show a => [QualifiedUserMap a] -> ShowS
forall a. Show a => QualifiedUserMap a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall a. Show a => Int -> QualifiedUserMap a -> ShowS
showsPrec :: Int -> QualifiedUserMap a -> ShowS
$cshow :: forall a. Show a => QualifiedUserMap a -> String
show :: QualifiedUserMap a -> String
$cshowList :: forall a. Show a => [QualifiedUserMap a] -> ShowS
showList :: [QualifiedUserMap a] -> ShowS
Show)
  deriving newtype (NonEmpty (QualifiedUserMap a) -> QualifiedUserMap a
QualifiedUserMap a -> QualifiedUserMap a -> QualifiedUserMap a
(QualifiedUserMap a -> QualifiedUserMap a -> QualifiedUserMap a)
-> (NonEmpty (QualifiedUserMap a) -> QualifiedUserMap a)
-> (forall b.
    Integral b =>
    b -> QualifiedUserMap a -> QualifiedUserMap a)
-> Semigroup (QualifiedUserMap a)
forall b.
Integral b =>
b -> QualifiedUserMap a -> QualifiedUserMap a
forall a. NonEmpty (QualifiedUserMap a) -> QualifiedUserMap a
forall a.
QualifiedUserMap a -> QualifiedUserMap a -> QualifiedUserMap a
forall a.
(a -> a -> a)
-> (NonEmpty a -> a)
-> (forall b. Integral b => b -> a -> a)
-> Semigroup a
forall a b.
Integral b =>
b -> QualifiedUserMap a -> QualifiedUserMap a
$c<> :: forall a.
QualifiedUserMap a -> QualifiedUserMap a -> QualifiedUserMap a
<> :: QualifiedUserMap a -> QualifiedUserMap a -> QualifiedUserMap a
$csconcat :: forall a. NonEmpty (QualifiedUserMap a) -> QualifiedUserMap a
sconcat :: NonEmpty (QualifiedUserMap a) -> QualifiedUserMap a
$cstimes :: forall a b.
Integral b =>
b -> QualifiedUserMap a -> QualifiedUserMap a
stimes :: forall b.
Integral b =>
b -> QualifiedUserMap a -> QualifiedUserMap a
Semigroup, Semigroup (QualifiedUserMap a)
QualifiedUserMap a
Semigroup (QualifiedUserMap a) =>
QualifiedUserMap a
-> (QualifiedUserMap a -> QualifiedUserMap a -> QualifiedUserMap a)
-> ([QualifiedUserMap a] -> QualifiedUserMap a)
-> Monoid (QualifiedUserMap a)
[QualifiedUserMap a] -> QualifiedUserMap a
QualifiedUserMap a -> QualifiedUserMap a -> QualifiedUserMap a
forall a. Semigroup (QualifiedUserMap a)
forall a. QualifiedUserMap a
forall a.
Semigroup a =>
a -> (a -> a -> a) -> ([a] -> a) -> Monoid a
forall a. [QualifiedUserMap a] -> QualifiedUserMap a
forall a.
QualifiedUserMap a -> QualifiedUserMap a -> QualifiedUserMap a
$cmempty :: forall a. QualifiedUserMap a
mempty :: QualifiedUserMap a
$cmappend :: forall a.
QualifiedUserMap a -> QualifiedUserMap a -> QualifiedUserMap a
mappend :: QualifiedUserMap a -> QualifiedUserMap a -> QualifiedUserMap a
$cmconcat :: forall a. [QualifiedUserMap a] -> QualifiedUserMap a
mconcat :: [QualifiedUserMap a] -> QualifiedUserMap a
Monoid, [QualifiedUserMap a] -> Value
[QualifiedUserMap a] -> Encoding
QualifiedUserMap a -> Value
QualifiedUserMap a -> Encoding
(QualifiedUserMap a -> Value)
-> (QualifiedUserMap a -> Encoding)
-> ([QualifiedUserMap a] -> Value)
-> ([QualifiedUserMap a] -> Encoding)
-> ToJSON (QualifiedUserMap a)
forall a. ToJSON a => [QualifiedUserMap a] -> Value
forall a. ToJSON a => [QualifiedUserMap a] -> Encoding
forall a. ToJSON a => QualifiedUserMap a -> Value
forall a. ToJSON a => QualifiedUserMap a -> Encoding
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
$ctoJSON :: forall a. ToJSON a => QualifiedUserMap a -> Value
toJSON :: QualifiedUserMap a -> Value
$ctoEncoding :: forall a. ToJSON a => QualifiedUserMap a -> Encoding
toEncoding :: QualifiedUserMap a -> Encoding
$ctoJSONList :: forall a. ToJSON a => [QualifiedUserMap a] -> Value
toJSONList :: [QualifiedUserMap a] -> Value
$ctoEncodingList :: forall a. ToJSON a => [QualifiedUserMap a] -> Encoding
toEncodingList :: [QualifiedUserMap a] -> Encoding
ToJSON, Value -> Parser [QualifiedUserMap a]
Value -> Parser (QualifiedUserMap a)
(Value -> Parser (QualifiedUserMap a))
-> (Value -> Parser [QualifiedUserMap a])
-> FromJSON (QualifiedUserMap a)
forall a. FromJSON a => Value -> Parser [QualifiedUserMap a]
forall a. FromJSON a => Value -> Parser (QualifiedUserMap a)
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
$cparseJSON :: forall a. FromJSON a => Value -> Parser (QualifiedUserMap a)
parseJSON :: Value -> Parser (QualifiedUserMap a)
$cparseJSONList :: forall a. FromJSON a => Value -> Parser [QualifiedUserMap a]
parseJSONList :: Value -> Parser [QualifiedUserMap a]
FromJSON)

instance Functor QualifiedUserMap where
  fmap :: forall a b. (a -> b) -> QualifiedUserMap a -> QualifiedUserMap b
fmap a -> b
f (QualifiedUserMap Map Domain (UserMap a)
qMap) =
    Map Domain (UserMap b) -> QualifiedUserMap b
forall a. Map Domain (UserMap a) -> QualifiedUserMap a
QualifiedUserMap (Map Domain (UserMap b) -> QualifiedUserMap b)
-> Map Domain (UserMap b) -> QualifiedUserMap b
forall a b. (a -> b) -> a -> b
$ a -> b
f (a -> b) -> Map Domain (UserMap a) -> Map Domain (UserMap b)
forall (f :: * -> *) (g :: * -> *) a b.
(Functor f, Functor g) =>
(a -> b) -> f (g a) -> f (g b)
<$$> Map Domain (UserMap a)
qMap

instance (Arbitrary a) => Arbitrary (QualifiedUserMap a) where
  arbitrary :: Gen (QualifiedUserMap a)
arbitrary = Map Domain (UserMap a) -> QualifiedUserMap a
forall a. Map Domain (UserMap a) -> QualifiedUserMap a
QualifiedUserMap (Map Domain (UserMap a) -> QualifiedUserMap a)
-> Gen (Map Domain (UserMap a)) -> Gen (QualifiedUserMap a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Domain -> Gen (UserMap a) -> Gen (Map Domain (UserMap a))
forall k v. Ord k => Gen k -> Gen v -> Gen (Map k v)
mapOf' Gen Domain
forall a. Arbitrary a => Gen a
arbitrary Gen (UserMap a)
forall a. Arbitrary a => Gen a
arbitrary

instance (ToSchema a, ToJSON a, Arbitrary a) => ToSchema (UserMap (Set a)) where
  declareNamedSchema :: Proxy (UserMap (Set a)) -> Declare (Definitions Schema) NamedSchema
declareNamedSchema Proxy (UserMap (Set a))
_ = do
    Schema
mapSch <- Proxy (Map UserId (Set a)) -> Declare (Definitions Schema) Schema
forall a.
ToSchema a =>
Proxy a -> Declare (Definitions Schema) Schema
declareSchema (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @(Map UserId (Set a)))
    let valueTypeName :: Text
valueTypeName = String -> Text
Text.pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$ TypeRep -> String
forall a. Show a => a -> String
show (TypeRep -> String) -> TypeRep -> String
forall a b. (a -> b) -> a -> b
$ Proxy a -> TypeRep
forall {k} (proxy :: k -> *) (a :: k).
Typeable a =>
proxy a -> TypeRep
typeRep (Proxy a -> TypeRep) -> Proxy a -> TypeRep
forall a b. (a -> b) -> a -> b
$ forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @a
    NamedSchema -> Declare (Definitions Schema) NamedSchema
forall a. a -> DeclareT (Definitions Schema) Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (NamedSchema -> Declare (Definitions Schema) NamedSchema)
-> NamedSchema -> Declare (Definitions Schema) NamedSchema
forall a b. (a -> b) -> a -> b
$
      Maybe Text -> Schema -> NamedSchema
NamedSchema (Text -> Maybe Text
forall a. a -> Maybe a
Just (Text -> Maybe Text) -> Text -> Maybe Text
forall a b. (a -> b) -> a -> b
$ Text
"UserMap_Set_" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
valueTypeName) (Schema -> NamedSchema) -> Schema -> NamedSchema
forall a b. (a -> b) -> a -> b
$
        Schema
mapSch
          Schema -> (Schema -> Schema) -> Schema
forall a b. a -> (a -> b) -> b
& (Maybe Text -> Identity (Maybe Text)) -> Schema -> Identity Schema
forall s a. HasDescription s a => Lens' s a
Lens' Schema (Maybe Text)
description ((Maybe Text -> Identity (Maybe Text))
 -> Schema -> Identity Schema)
-> Text -> Schema -> Schema
forall s t a b. ASetter s t a (Maybe b) -> b -> s -> t
?~ Text
"Map of UserId to (Set " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
valueTypeName Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
")"
          Schema -> (Schema -> Schema) -> Schema
forall a b. a -> (a -> b) -> b
& (Maybe Value -> Identity (Maybe Value))
-> Schema -> Identity Schema
forall s a. HasExample s a => Lens' s a
Lens' Schema (Maybe Value)
example ((Maybe Value -> Identity (Maybe Value))
 -> Schema -> Identity Schema)
-> Value -> Schema -> Schema
forall s t a b. ASetter s t a (Maybe b) -> b -> s -> t
?~ Map UserId (Set a) -> Value
forall a. ToJSON a => a -> Value
toJSON (UserId -> Set a -> Map UserId (Set a)
forall k a. k -> a -> Map k a
Map.singleton (forall a. Arbitrary a => a
generateExample @UserId) (a -> Set a
forall a. a -> Set a
Set.singleton (forall a. Arbitrary a => a
generateExample @a)))

instance (Typeable a, ToSchema (UserMap a)) => ToSchema (QualifiedUserMap a) where
  declareNamedSchema :: Proxy (QualifiedUserMap a)
-> Declare (Definitions Schema) NamedSchema
declareNamedSchema Proxy (QualifiedUserMap a)
_ = do
    Schema
mapSch <- Proxy (Map Domain (UserMap a))
-> Declare (Definitions Schema) Schema
forall a.
ToSchema a =>
Proxy a -> Declare (Definitions Schema) Schema
declareSchema (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @(Map Domain (UserMap a)))
    let userMapSchema :: Schema
userMapSchema = Proxy (UserMap a) -> Schema
forall a. ToSchema a => Proxy a -> Schema
toSchema (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @(UserMap a))
    let valueTypeName :: Text
valueTypeName = HasCallStack => Text -> Text -> Text -> Text
Text -> Text -> Text -> Text
Text.replace Text
" " Text
"_" (Text -> Text) -> (String -> Text) -> String -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Text
Text.pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$ TypeRep -> String
forall a. Show a => a -> String
show (TypeRep -> String) -> TypeRep -> String
forall a b. (a -> b) -> a -> b
$ Proxy a -> TypeRep
forall {k} (proxy :: k -> *) (a :: k).
Typeable a =>
proxy a -> TypeRep
typeRep (Proxy a -> TypeRep) -> Proxy a -> TypeRep
forall a b. (a -> b) -> a -> b
$ forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @a
    NamedSchema -> Declare (Definitions Schema) NamedSchema
forall a. a -> DeclareT (Definitions Schema) Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (NamedSchema -> Declare (Definitions Schema) NamedSchema)
-> NamedSchema -> Declare (Definitions Schema) NamedSchema
forall a b. (a -> b) -> a -> b
$
      Maybe Text -> Schema -> NamedSchema
NamedSchema (Text -> Maybe Text
forall a. a -> Maybe a
Just (Text -> Maybe Text) -> Text -> Maybe Text
forall a b. (a -> b) -> a -> b
$ Text
"QualifiedUserMap_" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
valueTypeName) (Schema -> NamedSchema) -> Schema -> NamedSchema
forall a b. (a -> b) -> a -> b
$
        Schema
mapSch
          Schema -> (Schema -> Schema) -> Schema
forall a b. a -> (a -> b) -> b
& (Maybe Text -> Identity (Maybe Text)) -> Schema -> Identity Schema
forall s a. HasDescription s a => Lens' s a
Lens' Schema (Maybe Text)
description ((Maybe Text -> Identity (Maybe Text))
 -> Schema -> Identity Schema)
-> Text -> Schema -> Schema
forall s t a b. ASetter s t a (Maybe b) -> b -> s -> t
?~ Text
"Map of Domain to (UserMap (" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
valueTypeName Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"))."
          Schema -> (Schema -> Schema) -> Schema
forall a b. a -> (a -> b) -> b
& (Maybe Value -> Identity (Maybe Value))
-> Schema -> Identity Schema
forall s a. HasExample s a => Lens' s a
Lens' Schema (Maybe Value)
example
            ((Maybe Value -> Identity (Maybe Value))
 -> Schema -> Identity Schema)
-> Value -> Schema -> Schema
forall s t a b. ASetter s t a (Maybe b) -> b -> s -> t
?~ Map Text (Maybe Value) -> Value
forall a. ToJSON a => a -> Value
toJSON
              (Text -> Maybe Value -> Map Text (Maybe Value)
forall k a. k -> a -> Map k a
Map.singleton (Text
"domain1.example.com" :: Text) (Schema
userMapSchema Schema -> Getting (Maybe Value) Schema (Maybe Value) -> Maybe Value
forall s a. s -> Getting a s a -> a
^. Getting (Maybe Value) Schema (Maybe Value)
forall s a. HasExample s a => Lens' s a
Lens' Schema (Maybe Value)
example))