module Database.Firestore.Internal where

import Control.Applicative (Applicative (liftA2))
import Control.Lens
import Control.Monad (join, msum)
import Data.Maybe (fromMaybe)
import Database.Firestore.Types
import qualified Network.Google.FireStore as FireStore

-- | This module is for the interaction with `gogol` stuff.

-- | There's a bug in gogol-firestore currently, apparently... that makes "nulls" slightly ambiguous. https://github.com/brendanhay/gogol/issues/170)
parseValue :: FireStore.Value -> Value
parseValue :: Value -> Value
parseValue Value
v =
  Value -> Maybe Value -> Value
forall a. a -> Maybe a -> a
fromMaybe
    -- (Unknown $ Text.pack $ show v)
    Value
Null
    (Maybe Value -> Value) -> Maybe Value -> Value
forall a b. (a -> b) -> a -> b
$ [Maybe Value] -> Maybe Value
forall (t :: * -> *) (m :: * -> *) a.
(Foldable t, MonadPlus m) =>
t (m a) -> m a
msum
      [ (Double -> Double -> Value)
-> Maybe Double -> Maybe Double -> Maybe Value
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 Double -> Double -> Value
GeoPoint (Maybe (Maybe Double) -> Maybe Double
forall (m :: * -> *) a. Monad m => m (m a) -> m a
join (Maybe (Maybe Double) -> Maybe Double)
-> Maybe (Maybe Double) -> Maybe Double
forall a b. (a -> b) -> a -> b
$ Value
v Value
-> Getting (First (Maybe Double)) Value (Maybe Double)
-> Maybe (Maybe Double)
forall s a. s -> Getting (First a) s a -> Maybe a
^? ((Maybe LatLng -> Const (First (Maybe Double)) (Maybe LatLng))
-> Value -> Const (First (Maybe Double)) Value
Lens' Value (Maybe LatLng)
FireStore.vGeoPointValue ((Maybe LatLng -> Const (First (Maybe Double)) (Maybe LatLng))
 -> Value -> Const (First (Maybe Double)) Value)
-> ((Maybe Double -> Const (First (Maybe Double)) (Maybe Double))
    -> Maybe LatLng -> Const (First (Maybe Double)) (Maybe LatLng))
-> Getting (First (Maybe Double)) Value (Maybe Double)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (LatLng -> Const (First (Maybe Double)) LatLng)
-> Maybe LatLng -> Const (First (Maybe Double)) (Maybe LatLng)
forall a b. Prism (Maybe a) (Maybe b) a b
_Just ((LatLng -> Const (First (Maybe Double)) LatLng)
 -> Maybe LatLng -> Const (First (Maybe Double)) (Maybe LatLng))
-> ((Maybe Double -> Const (First (Maybe Double)) (Maybe Double))
    -> LatLng -> Const (First (Maybe Double)) LatLng)
-> (Maybe Double -> Const (First (Maybe Double)) (Maybe Double))
-> Maybe LatLng
-> Const (First (Maybe Double)) (Maybe LatLng)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Maybe Double -> Const (First (Maybe Double)) (Maybe Double))
-> LatLng -> Const (First (Maybe Double)) LatLng
Lens' LatLng (Maybe Double)
FireStore.llLatitude)) (Maybe (Maybe Double) -> Maybe Double
forall (m :: * -> *) a. Monad m => m (m a) -> m a
join (Maybe (Maybe Double) -> Maybe Double)
-> Maybe (Maybe Double) -> Maybe Double
forall a b. (a -> b) -> a -> b
$ Value
v Value
-> Getting (First (Maybe Double)) Value (Maybe Double)
-> Maybe (Maybe Double)
forall s a. s -> Getting (First a) s a -> Maybe a
^? ((Maybe LatLng -> Const (First (Maybe Double)) (Maybe LatLng))
-> Value -> Const (First (Maybe Double)) Value
Lens' Value (Maybe LatLng)
FireStore.vGeoPointValue ((Maybe LatLng -> Const (First (Maybe Double)) (Maybe LatLng))
 -> Value -> Const (First (Maybe Double)) Value)
-> ((Maybe Double -> Const (First (Maybe Double)) (Maybe Double))
    -> Maybe LatLng -> Const (First (Maybe Double)) (Maybe LatLng))
-> Getting (First (Maybe Double)) Value (Maybe Double)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (LatLng -> Const (First (Maybe Double)) LatLng)
-> Maybe LatLng -> Const (First (Maybe Double)) (Maybe LatLng)
forall a b. Prism (Maybe a) (Maybe b) a b
_Just ((LatLng -> Const (First (Maybe Double)) LatLng)
 -> Maybe LatLng -> Const (First (Maybe Double)) (Maybe LatLng))
-> ((Maybe Double -> Const (First (Maybe Double)) (Maybe Double))
    -> LatLng -> Const (First (Maybe Double)) LatLng)
-> (Maybe Double -> Const (First (Maybe Double)) (Maybe Double))
-> Maybe LatLng
-> Const (First (Maybe Double)) (Maybe LatLng)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Maybe Double -> Const (First (Maybe Double)) (Maybe Double))
-> LatLng -> Const (First (Maybe Double)) LatLng
Lens' LatLng (Maybe Double)
FireStore.llLongitude)),
        ByteString -> Value
Bytes (ByteString -> Value) -> Maybe ByteString -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Value
v Value
-> Getting (Maybe ByteString) Value (Maybe ByteString)
-> Maybe ByteString
forall s a. s -> Getting a s a -> a
^. Getting (Maybe ByteString) Value (Maybe ByteString)
Lens' Value (Maybe ByteString)
FireStore.vBytesValue,
        Integer -> Value
Int (Integer -> Value) -> (Int64 -> Integer) -> Int64 -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int64 -> Integer
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int64 -> Value) -> Maybe Int64 -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Value
v Value -> Getting (Maybe Int64) Value (Maybe Int64) -> Maybe Int64
forall s a. s -> Getting a s a -> a
^. Getting (Maybe Int64) Value (Maybe Int64)
Lens' Value (Maybe Int64)
FireStore.vIntegerValue,
        UTCTime -> Value
Timestamp (UTCTime -> Value) -> Maybe UTCTime -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Value
v Value
-> Getting (Maybe UTCTime) Value (Maybe UTCTime) -> Maybe UTCTime
forall s a. s -> Getting a s a -> a
^. Getting (Maybe UTCTime) Value (Maybe UTCTime)
Lens' Value (Maybe UTCTime)
FireStore.vTimestampValue,
        Double -> Value
Double (Double -> Value) -> Maybe Double -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Value
v Value
-> Getting (Maybe Double) Value (Maybe Double) -> Maybe Double
forall s a. s -> Getting a s a -> a
^. Getting (Maybe Double) Value (Maybe Double)
Lens' Value (Maybe Double)
FireStore.vDoubleValue,
        Text -> Value
String (Text -> Value) -> Maybe Text -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Value
v Value -> Getting (Maybe Text) Value (Maybe Text) -> Maybe Text
forall s a. s -> Getting a s a -> a
^. Getting (Maybe Text) Value (Maybe Text)
Lens' Value (Maybe Text)
FireStore.vStringValue,
        Bool -> Value
Bool (Bool -> Value) -> Maybe Bool -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Value
v Value -> Getting (Maybe Bool) Value (Maybe Bool) -> Maybe Bool
forall s a. s -> Getting a s a -> a
^. Getting (Maybe Bool) Value (Maybe Bool)
Lens' Value (Maybe Bool)
FireStore.vBooleanValue,
        HashMap Text Value -> Value
Map (HashMap Text Value -> Value)
-> (HashMap Text Value -> HashMap Text Value)
-> HashMap Text Value
-> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Value -> Value) -> HashMap Text Value -> HashMap Text Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Value -> Value
parseValue
          (HashMap Text Value -> Value)
-> Maybe (HashMap Text Value) -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Value
v Value
-> Getting (First (HashMap Text Value)) Value (HashMap Text Value)
-> Maybe (HashMap Text Value)
forall s a. s -> Getting (First a) s a -> Maybe a
^? ((Maybe MapValue
 -> Const (First (HashMap Text Value)) (Maybe MapValue))
-> Value -> Const (First (HashMap Text Value)) Value
Lens' Value (Maybe MapValue)
FireStore.vMapValue ((Maybe MapValue
  -> Const (First (HashMap Text Value)) (Maybe MapValue))
 -> Value -> Const (First (HashMap Text Value)) Value)
-> ((HashMap Text Value
     -> Const (First (HashMap Text Value)) (HashMap Text Value))
    -> Maybe MapValue
    -> Const (First (HashMap Text Value)) (Maybe MapValue))
-> Getting (First (HashMap Text Value)) Value (HashMap Text Value)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (MapValue -> Const (First (HashMap Text Value)) MapValue)
-> Maybe MapValue
-> Const (First (HashMap Text Value)) (Maybe MapValue)
forall a b. Prism (Maybe a) (Maybe b) a b
_Just ((MapValue -> Const (First (HashMap Text Value)) MapValue)
 -> Maybe MapValue
 -> Const (First (HashMap Text Value)) (Maybe MapValue))
-> ((HashMap Text Value
     -> Const (First (HashMap Text Value)) (HashMap Text Value))
    -> MapValue -> Const (First (HashMap Text Value)) MapValue)
-> (HashMap Text Value
    -> Const (First (HashMap Text Value)) (HashMap Text Value))
-> Maybe MapValue
-> Const (First (HashMap Text Value)) (Maybe MapValue)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Maybe MapValueFields
 -> Const (First (HashMap Text Value)) (Maybe MapValueFields))
-> MapValue -> Const (First (HashMap Text Value)) MapValue
Lens' MapValue (Maybe MapValueFields)
FireStore.mvFields ((Maybe MapValueFields
  -> Const (First (HashMap Text Value)) (Maybe MapValueFields))
 -> MapValue -> Const (First (HashMap Text Value)) MapValue)
-> ((HashMap Text Value
     -> Const (First (HashMap Text Value)) (HashMap Text Value))
    -> Maybe MapValueFields
    -> Const (First (HashMap Text Value)) (Maybe MapValueFields))
-> (HashMap Text Value
    -> Const (First (HashMap Text Value)) (HashMap Text Value))
-> MapValue
-> Const (First (HashMap Text Value)) MapValue
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (MapValueFields
 -> Const (First (HashMap Text Value)) MapValueFields)
-> Maybe MapValueFields
-> Const (First (HashMap Text Value)) (Maybe MapValueFields)
forall a b. Prism (Maybe a) (Maybe b) a b
_Just ((MapValueFields
  -> Const (First (HashMap Text Value)) MapValueFields)
 -> Maybe MapValueFields
 -> Const (First (HashMap Text Value)) (Maybe MapValueFields))
-> ((HashMap Text Value
     -> Const (First (HashMap Text Value)) (HashMap Text Value))
    -> MapValueFields
    -> Const (First (HashMap Text Value)) MapValueFields)
-> (HashMap Text Value
    -> Const (First (HashMap Text Value)) (HashMap Text Value))
-> Maybe MapValueFields
-> Const (First (HashMap Text Value)) (Maybe MapValueFields)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (HashMap Text Value
 -> Const (First (HashMap Text Value)) (HashMap Text Value))
-> MapValueFields
-> Const (First (HashMap Text Value)) MapValueFields
Lens' MapValueFields (HashMap Text Value)
FireStore.mvfAddtional),
        [Value] -> Value
Array ([Value] -> Value) -> ([Value] -> [Value]) -> [Value] -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Value -> Value) -> [Value] -> [Value]
forall a b. (a -> b) -> [a] -> [b]
map Value -> Value
parseValue ([Value] -> Value) -> Maybe [Value] -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Value
v Value -> Getting (First [Value]) Value [Value] -> Maybe [Value]
forall s a. s -> Getting (First a) s a -> Maybe a
^? ((Maybe ArrayValue -> Const (First [Value]) (Maybe ArrayValue))
-> Value -> Const (First [Value]) Value
Lens' Value (Maybe ArrayValue)
FireStore.vArrayValue ((Maybe ArrayValue -> Const (First [Value]) (Maybe ArrayValue))
 -> Value -> Const (First [Value]) Value)
-> (([Value] -> Const (First [Value]) [Value])
    -> Maybe ArrayValue -> Const (First [Value]) (Maybe ArrayValue))
-> Getting (First [Value]) Value [Value]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ArrayValue -> Const (First [Value]) ArrayValue)
-> Maybe ArrayValue -> Const (First [Value]) (Maybe ArrayValue)
forall a b. Prism (Maybe a) (Maybe b) a b
_Just ((ArrayValue -> Const (First [Value]) ArrayValue)
 -> Maybe ArrayValue -> Const (First [Value]) (Maybe ArrayValue))
-> (([Value] -> Const (First [Value]) [Value])
    -> ArrayValue -> Const (First [Value]) ArrayValue)
-> ([Value] -> Const (First [Value]) [Value])
-> Maybe ArrayValue
-> Const (First [Value]) (Maybe ArrayValue)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([Value] -> Const (First [Value]) [Value])
-> ArrayValue -> Const (First [Value]) ArrayValue
Lens' ArrayValue [Value]
FireStore.avValues),
        Text -> Value
Reference (Text -> Value) -> Maybe Text -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Value
v Value -> Getting (Maybe Text) Value (Maybe Text) -> Maybe Text
forall s a. s -> Getting a s a -> a
^. Getting (Maybe Text) Value (Maybe Text)
Lens' Value (Maybe Text)
FireStore.vReferenceValue,
        Value
Null Value -> Maybe ValueNullValue -> Maybe Value
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Value
v Value
-> Getting (Maybe ValueNullValue) Value (Maybe ValueNullValue)
-> Maybe ValueNullValue
forall s a. s -> Getting a s a -> a
^. Getting (Maybe ValueNullValue) Value (Maybe ValueNullValue)
Lens' Value (Maybe ValueNullValue)
FireStore.vNullValue
      ]

buildValue :: Value -> FireStore.Value
buildValue :: Value -> Value
buildValue Value
v =
  Value
FireStore.value
    Value -> (Value -> Value) -> Value
forall a b. a -> (a -> b) -> b
& (Maybe LatLng -> Identity (Maybe LatLng))
-> Value -> Identity Value
Lens' Value (Maybe LatLng)
FireStore.vGeoPointValue
      ((Maybe LatLng -> Identity (Maybe LatLng))
 -> Value -> Identity Value)
-> Maybe LatLng -> Value -> Value
forall s t a b. ASetter s t a b -> b -> s -> t
.~ ( ( \(Double
lat, Double
lng) ->
               LatLng
FireStore.latLng
                 LatLng -> (LatLng -> LatLng) -> LatLng
forall a b. a -> (a -> b) -> b
& (Maybe Double -> Identity (Maybe Double))
-> LatLng -> Identity LatLng
Lens' LatLng (Maybe Double)
FireStore.llLatitude ((Maybe Double -> Identity (Maybe Double))
 -> LatLng -> Identity LatLng)
-> Double -> LatLng -> LatLng
forall s t a b. ASetter s t a (Maybe b) -> b -> s -> t
?~ Double
lat
                 LatLng -> (LatLng -> LatLng) -> LatLng
forall a b. a -> (a -> b) -> b
& (Maybe Double -> Identity (Maybe Double))
-> LatLng -> Identity LatLng
Lens' LatLng (Maybe Double)
FireStore.llLongitude ((Maybe Double -> Identity (Maybe Double))
 -> LatLng -> Identity LatLng)
-> Double -> LatLng -> LatLng
forall s t a b. ASetter s t a (Maybe b) -> b -> s -> t
?~ Double
lng
           )
             ((Double, Double) -> LatLng)
-> Maybe (Double, Double) -> Maybe LatLng
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Value
v
             Value
-> Getting (First (Double, Double)) Value (Double, Double)
-> Maybe (Double, Double)
forall s a. s -> Getting (First a) s a -> Maybe a
^? Getting (First (Double, Double)) Value (Double, Double)
Prism' Value (Double, Double)
_GeoPoint
         )
    Value -> (Value -> Value) -> Value
forall a b. a -> (a -> b) -> b
& (Maybe ByteString -> Identity (Maybe ByteString))
-> Value -> Identity Value
Lens' Value (Maybe ByteString)
FireStore.vBytesValue ((Maybe ByteString -> Identity (Maybe ByteString))
 -> Value -> Identity Value)
-> Maybe ByteString -> Value -> Value
forall s t a b. ASetter s t a b -> b -> s -> t
.~ (Value
v Value
-> Getting (First ByteString) Value ByteString -> Maybe ByteString
forall s a. s -> Getting (First a) s a -> Maybe a
^? Getting (First ByteString) Value ByteString
Prism' Value ByteString
_Bytes)
    Value -> (Value -> Value) -> Value
forall a b. a -> (a -> b) -> b
& (Maybe Int64 -> Identity (Maybe Int64)) -> Value -> Identity Value
Lens' Value (Maybe Int64)
FireStore.vIntegerValue ((Maybe Int64 -> Identity (Maybe Int64))
 -> Value -> Identity Value)
-> Maybe Int64 -> Value -> Value
forall s t a b. ASetter s t a b -> b -> s -> t
.~ (Integer -> Int64
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Integer -> Int64) -> Maybe Integer -> Maybe Int64
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Value
v Value -> Getting (First Integer) Value Integer -> Maybe Integer
forall s a. s -> Getting (First a) s a -> Maybe a
^? Getting (First Integer) Value Integer
Prism' Value Integer
_Int)
    Value -> (Value -> Value) -> Value
forall a b. a -> (a -> b) -> b
& (Maybe UTCTime -> Identity (Maybe UTCTime))
-> Value -> Identity Value
Lens' Value (Maybe UTCTime)
FireStore.vTimestampValue ((Maybe UTCTime -> Identity (Maybe UTCTime))
 -> Value -> Identity Value)
-> Maybe UTCTime -> Value -> Value
forall s t a b. ASetter s t a b -> b -> s -> t
.~ (Value
v Value -> Getting (First UTCTime) Value UTCTime -> Maybe UTCTime
forall s a. s -> Getting (First a) s a -> Maybe a
^? Getting (First UTCTime) Value UTCTime
Prism' Value UTCTime
_Timestamp)
    Value -> (Value -> Value) -> Value
forall a b. a -> (a -> b) -> b
& (Maybe Double -> Identity (Maybe Double))
-> Value -> Identity Value
Lens' Value (Maybe Double)
FireStore.vDoubleValue ((Maybe Double -> Identity (Maybe Double))
 -> Value -> Identity Value)
-> Maybe Double -> Value -> Value
forall s t a b. ASetter s t a b -> b -> s -> t
.~ (Value
v Value -> Getting (First Double) Value Double -> Maybe Double
forall s a. s -> Getting (First a) s a -> Maybe a
^? Getting (First Double) Value Double
Prism' Value Double
_Double)
    Value -> (Value -> Value) -> Value
forall a b. a -> (a -> b) -> b
& (Maybe Text -> Identity (Maybe Text)) -> Value -> Identity Value
Lens' Value (Maybe Text)
FireStore.vStringValue ((Maybe Text -> Identity (Maybe Text)) -> Value -> Identity Value)
-> Maybe Text -> Value -> Value
forall s t a b. ASetter s t a b -> b -> s -> t
.~ (Value
v Value -> Getting (First Text) Value Text -> Maybe Text
forall s a. s -> Getting (First a) s a -> Maybe a
^? Getting (First Text) Value Text
Prism' Value Text
_String)
    Value -> (Value -> Value) -> Value
forall a b. a -> (a -> b) -> b
& (Maybe Bool -> Identity (Maybe Bool)) -> Value -> Identity Value
Lens' Value (Maybe Bool)
FireStore.vBooleanValue ((Maybe Bool -> Identity (Maybe Bool)) -> Value -> Identity Value)
-> Maybe Bool -> Value -> Value
forall s t a b. ASetter s t a b -> b -> s -> t
.~ (Value
v Value -> Getting (First Bool) Value Bool -> Maybe Bool
forall s a. s -> Getting (First a) s a -> Maybe a
^? Getting (First Bool) Value Bool
Prism' Value Bool
_Bool)
    Value -> (Value -> Value) -> Value
forall a b. a -> (a -> b) -> b
& (Maybe MapValue -> Identity (Maybe MapValue))
-> Value -> Identity Value
Lens' Value (Maybe MapValue)
FireStore.vMapValue
      ((Maybe MapValue -> Identity (Maybe MapValue))
 -> Value -> Identity Value)
-> Maybe MapValue -> Value -> Value
forall s t a b. ASetter s t a b -> b -> s -> t
.~ ( (\HashMap Text Value
v -> MapValue
FireStore.mapValue MapValue -> (MapValue -> MapValue) -> MapValue
forall a b. a -> (a -> b) -> b
& (Maybe MapValueFields -> Identity (Maybe MapValueFields))
-> MapValue -> Identity MapValue
Lens' MapValue (Maybe MapValueFields)
FireStore.mvFields ((Maybe MapValueFields -> Identity (Maybe MapValueFields))
 -> MapValue -> Identity MapValue)
-> MapValueFields -> MapValue -> MapValue
forall s t a b. ASetter s t a (Maybe b) -> b -> s -> t
?~ HashMap Text Value -> MapValueFields
FireStore.mapValueFields HashMap Text Value
v) (HashMap Text Value -> MapValue)
-> (HashMap Text Value -> HashMap Text Value)
-> HashMap Text Value
-> MapValue
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Value -> Value) -> HashMap Text Value -> HashMap Text Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Value -> Value
buildValue (HashMap Text Value -> MapValue)
-> Maybe (HashMap Text Value) -> Maybe MapValue
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Value
v Value
-> Getting (First (HashMap Text Value)) Value (HashMap Text Value)
-> Maybe (HashMap Text Value)
forall s a. s -> Getting (First a) s a -> Maybe a
^? Getting (First (HashMap Text Value)) Value (HashMap Text Value)
Prism' Value (HashMap Text Value)
_Map
         )
    Value -> (Value -> Value) -> Value
forall a b. a -> (a -> b) -> b
& (Maybe ArrayValue -> Identity (Maybe ArrayValue))
-> Value -> Identity Value
Lens' Value (Maybe ArrayValue)
FireStore.vArrayValue ((Maybe ArrayValue -> Identity (Maybe ArrayValue))
 -> Value -> Identity Value)
-> Maybe ArrayValue -> Value -> Value
forall s t a b. ASetter s t a b -> b -> s -> t
.~ ((\[Value]
v -> ArrayValue
FireStore.arrayValue ArrayValue -> (ArrayValue -> ArrayValue) -> ArrayValue
forall a b. a -> (a -> b) -> b
& ([Value] -> Identity [Value]) -> ArrayValue -> Identity ArrayValue
Lens' ArrayValue [Value]
FireStore.avValues (([Value] -> Identity [Value])
 -> ArrayValue -> Identity ArrayValue)
-> [Value] -> ArrayValue -> ArrayValue
forall s t a b. ASetter s t a b -> b -> s -> t
.~ [Value]
v) ([Value] -> ArrayValue)
-> ([Value] -> [Value]) -> [Value] -> ArrayValue
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Value -> Value) -> [Value] -> [Value]
forall a b. (a -> b) -> [a] -> [b]
map Value -> Value
buildValue ([Value] -> ArrayValue) -> Maybe [Value] -> Maybe ArrayValue
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Value
v Value -> Getting (First [Value]) Value [Value] -> Maybe [Value]
forall s a. s -> Getting (First a) s a -> Maybe a
^? Getting (First [Value]) Value [Value]
Prism' Value [Value]
_Array)
    Value -> (Value -> Value) -> Value
forall a b. a -> (a -> b) -> b
& (Maybe Text -> Identity (Maybe Text)) -> Value -> Identity Value
Lens' Value (Maybe Text)
FireStore.vReferenceValue ((Maybe Text -> Identity (Maybe Text)) -> Value -> Identity Value)
-> Maybe Text -> Value -> Value
forall s t a b. ASetter s t a b -> b -> s -> t
.~ (Value
v Value -> Getting (First Text) Value Text -> Maybe Text
forall s a. s -> Getting (First a) s a -> Maybe a
^? Getting (First Text) Value Text
Prism' Value Text
_Reference)
    Value -> (Value -> Value) -> Value
forall a b. a -> (a -> b) -> b
& (Maybe ValueNullValue -> Identity (Maybe ValueNullValue))
-> Value -> Identity Value
Lens' Value (Maybe ValueNullValue)
FireStore.vNullValue ((Maybe ValueNullValue -> Identity (Maybe ValueNullValue))
 -> Value -> Identity Value)
-> Maybe ValueNullValue -> Value -> Value
forall s t a b. ASetter s t a b -> b -> s -> t
.~ (ValueNullValue
FireStore.NullValue ValueNullValue -> Maybe () -> Maybe ValueNullValue
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Value
v Value -> Getting (First ()) Value () -> Maybe ()
forall s a. s -> Getting (First a) s a -> Maybe a
^? Getting (First ()) Value ()
Prism' Value ()
_Null)

parseDocument :: FireStore.Document -> Document
parseDocument :: Document -> Document
parseDocument Document
d =
  Maybe Text
-> Maybe UTCTime -> Maybe UTCTime -> HashMap Text Value -> Document
Document
    (Document
d Document
-> Getting (Maybe Text) Document (Maybe Text) -> Maybe Text
forall s a. s -> Getting a s a -> a
^. Getting (Maybe Text) Document (Maybe Text)
Lens' Document (Maybe Text)
FireStore.dName)
    (Document
d Document
-> Getting (Maybe UTCTime) Document (Maybe UTCTime)
-> Maybe UTCTime
forall s a. s -> Getting a s a -> a
^. Getting (Maybe UTCTime) Document (Maybe UTCTime)
Lens' Document (Maybe UTCTime)
FireStore.dCreateTime)
    (Document
d Document
-> Getting (Maybe UTCTime) Document (Maybe UTCTime)
-> Maybe UTCTime
forall s a. s -> Getting a s a -> a
^. Getting (Maybe UTCTime) Document (Maybe UTCTime)
Lens' Document (Maybe UTCTime)
FireStore.dUpdateTime)
    (Value -> Value
parseValue (Value -> Value) -> HashMap Text Value -> HashMap Text Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Document
d Document
-> Getting (HashMap Text Value) Document (HashMap Text Value)
-> HashMap Text Value
forall s a. s -> Getting a s a -> a
^. (Maybe DocumentFields
 -> Const (HashMap Text Value) (Maybe DocumentFields))
-> Document -> Const (HashMap Text Value) Document
Lens' Document (Maybe DocumentFields)
FireStore.dFields ((Maybe DocumentFields
  -> Const (HashMap Text Value) (Maybe DocumentFields))
 -> Document -> Const (HashMap Text Value) Document)
-> ((HashMap Text Value
     -> Const (HashMap Text Value) (HashMap Text Value))
    -> Maybe DocumentFields
    -> Const (HashMap Text Value) (Maybe DocumentFields))
-> Getting (HashMap Text Value) Document (HashMap Text Value)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (DocumentFields -> Const (HashMap Text Value) DocumentFields)
-> Maybe DocumentFields
-> Const (HashMap Text Value) (Maybe DocumentFields)
forall a b. Prism (Maybe a) (Maybe b) a b
_Just ((DocumentFields -> Const (HashMap Text Value) DocumentFields)
 -> Maybe DocumentFields
 -> Const (HashMap Text Value) (Maybe DocumentFields))
-> ((HashMap Text Value
     -> Const (HashMap Text Value) (HashMap Text Value))
    -> DocumentFields -> Const (HashMap Text Value) DocumentFields)
-> (HashMap Text Value
    -> Const (HashMap Text Value) (HashMap Text Value))
-> Maybe DocumentFields
-> Const (HashMap Text Value) (Maybe DocumentFields)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (HashMap Text Value
 -> Const (HashMap Text Value) (HashMap Text Value))
-> DocumentFields -> Const (HashMap Text Value) DocumentFields
Lens' DocumentFields (HashMap Text Value)
FireStore.dfAddtional)

buildDocument :: Document -> FireStore.Document
buildDocument :: Document -> Document
buildDocument (Document {Maybe Text
name :: Document -> Maybe Text
name :: Maybe Text
name, HashMap Text Value
fields :: Document -> HashMap Text Value
fields :: HashMap Text Value
fields}) =
  Document
FireStore.document
    Document -> (Document -> Document) -> Document
forall a b. a -> (a -> b) -> b
& (Maybe Text -> Identity (Maybe Text))
-> Document -> Identity Document
Lens' Document (Maybe Text)
FireStore.dName ((Maybe Text -> Identity (Maybe Text))
 -> Document -> Identity Document)
-> Maybe Text -> Document -> Document
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Maybe Text
name
    Document -> (Document -> Document) -> Document
forall a b. a -> (a -> b) -> b
& (Maybe DocumentFields -> Identity (Maybe DocumentFields))
-> Document -> Identity Document
Lens' Document (Maybe DocumentFields)
FireStore.dFields
      ((Maybe DocumentFields -> Identity (Maybe DocumentFields))
 -> Document -> Identity Document)
-> DocumentFields -> Document -> Document
forall s t a b. ASetter s t a (Maybe b) -> b -> s -> t
?~ ( HashMap Text Value -> DocumentFields
FireStore.documentFields ((Value -> Value) -> HashMap Text Value -> HashMap Text Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Value -> Value
buildValue HashMap Text Value
fields)
         )