{-# LANGUAGE OverloadedStrings #-}

module Hydra.Sources.Tier4.Langs.Json.Decoding where

-- TODO: standardized Tier-4 imports
import           Prelude hiding ((++))
import qualified Data.List                 as L
import qualified Data.Map                  as M
import qualified Data.Set                  as S
import qualified Data.Maybe                as Y
import           Hydra.Dsl.Base            as Base
import qualified Hydra.Dsl.Core            as Core
import qualified Hydra.Dsl.Graph           as Graph
import qualified Hydra.Dsl.Lib.Equality    as Equality
import qualified Hydra.Dsl.Lib.Flows       as Flows
import qualified Hydra.Dsl.Lib.Io          as Io
import qualified Hydra.Dsl.Lib.Lists       as Lists
import qualified Hydra.Dsl.Lib.Literals    as Literals
import qualified Hydra.Dsl.Lib.Logic       as Logic
import qualified Hydra.Dsl.Lib.Maps        as Maps
import qualified Hydra.Dsl.Lib.Math        as Math
import qualified Hydra.Dsl.Lib.Optionals   as Optionals
import qualified Hydra.Dsl.Lib.Sets        as Sets
import           Hydra.Dsl.Lib.Strings     as Strings
import qualified Hydra.Dsl.Module          as Module
import qualified Hydra.Dsl.Terms           as Terms
import qualified Hydra.Dsl.Types           as Types
import           Hydra.Sources.Tier2.All

import qualified Hydra.Json as Json
import Hydra.Sources.Tier0.Json


jsonDecodingModule :: Module
jsonDecodingModule :: Module
jsonDecodingModule = Namespace
-> [Element] -> [Module] -> [Module] -> Maybe String -> Module
Module (String -> Namespace
Namespace String
"hydra/langs/json/decoding") [Element]
elements
    [Module
jsonModelModule, Module
hydraCoreModule] (Module
jsonModelModuleModule -> [Module] -> [Module]
forall a. a -> [a] -> [a]
:[Module]
tier0Modules) (Maybe String -> Module) -> Maybe String -> Module
forall a b. (a -> b) -> a -> b
$
    String -> Maybe String
forall a. a -> Maybe a
Just String
"Decoding functions for JSON data"
  where
   elements :: [Element]
elements = [
     Definition (Value -> Flow Any String) -> Element
forall a. Definition a -> Element
Base.el Definition (Value -> Flow Any String)
forall s. Definition (Value -> Flow s String)
decodeStringDef,
     Definition (Value -> Flow Any Double) -> Element
forall a. Definition a -> Element
Base.el Definition (Value -> Flow Any Double)
forall s. Definition (Value -> Flow s Double)
decodeNumberDef,
     Definition (Value -> Flow Any Bool) -> Element
forall a. Definition a -> Element
Base.el Definition (Value -> Flow Any Bool)
forall s. Definition (Value -> Flow s Bool)
decodeBooleanDef,
     Definition ((Value -> Flow Any Any) -> Value -> Flow Any [Any])
-> Element
forall a. Definition a -> Element
Base.el Definition ((Value -> Flow Any Any) -> Value -> Flow Any [Any])
forall s a. Definition ((Value -> Flow s a) -> Value -> Flow s [a])
decodeArrayDef,
     Definition (Value -> Flow Any (Map String Value)) -> Element
forall a. Definition a -> Element
Base.el Definition (Value -> Flow Any (Map String Value))
forall s. Definition (Value -> Flow s (Map String Value))
decodeObjectDef,
     Definition
  ((Value -> Flow Any Any)
   -> String -> Map String Value -> Flow Any Any)
-> Element
forall a. Definition a -> Element
Base.el Definition
  ((Value -> Flow Any Any)
   -> String -> Map String Value -> Flow Any Any)
forall s a.
Definition
  ((Value -> Flow s a) -> String -> Map String Value -> Flow s a)
decodeFieldDef,
     Definition
  ((Value -> Flow Any Any)
   -> String -> Map String Value -> Flow Any (Maybe Any))
-> Element
forall a. Definition a -> Element
Base.el Definition
  ((Value -> Flow Any Any)
   -> String -> Map String Value -> Flow Any (Maybe Any))
forall s a.
Definition
  ((Value -> Flow s a)
   -> String -> Map String Value -> Flow s (Maybe a))
decodeOptionalFieldDef]

jsonDecodingDefinition :: String -> Datum a -> Definition a
jsonDecodingDefinition :: forall a. String -> Datum a -> Definition a
jsonDecodingDefinition String
label = Module -> String -> Datum a -> Definition a
forall a. Module -> String -> Datum a -> Definition a
definitionInModule Module
jsonDecodingModule (String
"decode" String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
label)

valueT :: Type
valueT = Name -> Type
TypeVariable Name
Json._Value

decodeStringDef :: Definition (Json.Value -> Flow s String)
decodeStringDef :: forall s. Definition (Value -> Flow s String)
decodeStringDef  = String
-> Datum (Value -> Flow s String)
-> Definition (Value -> Flow s String)
forall a. String -> Datum a -> Definition a
jsonDecodingDefinition String
"String" (Datum (Value -> Flow s String)
 -> Definition (Value -> Flow s String))
-> Datum (Value -> Flow s String)
-> Definition (Value -> Flow s String)
forall a b. (a -> b) -> a -> b
$
  Type
-> Type
-> Datum (Value -> Flow s String)
-> Datum (Value -> Flow s String)
forall a. Type -> Type -> Datum a -> Datum a
function Type
valueT (Type -> Type -> Type
flowT Type
sT Type
stringT) (Datum (Value -> Flow s String) -> Datum (Value -> Flow s String))
-> Datum (Value -> Flow s String) -> Datum (Value -> Flow s String)
forall a b. (a -> b) -> a -> b
$
  Name
-> Maybe (Datum (Flow s String))
-> [Field]
-> Datum (Value -> Flow s String)
forall b u. Name -> Maybe (Datum b) -> [Field] -> Datum (u -> b)
match Name
Json._Value (Datum (Flow s String) -> Maybe (Datum (Flow s String))
forall a. a -> Maybe a
Just (Datum (Flow s String) -> Maybe (Datum (Flow s String)))
-> Datum (Flow s String) -> Maybe (Datum (Flow s String))
forall a b. (a -> b) -> a -> b
$ Datum (String -> Flow s String)
forall s x. Datum (String -> Flow s x)
Flows.fail Datum (String -> Flow s String)
-> Datum String -> Datum (Flow s String)
forall a b. Datum (a -> b) -> Datum a -> Datum b
@@ Datum String
"expected a string") [
    Name
Json._Value_stringName -> Datum (Any -> Flow Any Any) -> Field
forall a. Name -> Datum a -> Field
>>: Datum (Any -> Flow Any Any)
forall x s. Datum (x -> Flow s x)
Flows.pure]

decodeNumberDef :: Definition (Json.Value -> Flow s Double)
decodeNumberDef :: forall s. Definition (Value -> Flow s Double)
decodeNumberDef  = String
-> Datum (Value -> Flow s Double)
-> Definition (Value -> Flow s Double)
forall a. String -> Datum a -> Definition a
jsonDecodingDefinition String
"Number" (Datum (Value -> Flow s Double)
 -> Definition (Value -> Flow s Double))
-> Datum (Value -> Flow s Double)
-> Definition (Value -> Flow s Double)
forall a b. (a -> b) -> a -> b
$
  Type
-> Type
-> Datum (Value -> Flow s Double)
-> Datum (Value -> Flow s Double)
forall a. Type -> Type -> Datum a -> Datum a
function Type
valueT (Type -> Type -> Type
flowT Type
sT Type
Types.bigfloat) (Datum (Value -> Flow s Double) -> Datum (Value -> Flow s Double))
-> Datum (Value -> Flow s Double) -> Datum (Value -> Flow s Double)
forall a b. (a -> b) -> a -> b
$
  Name
-> Maybe (Datum (Flow s Double))
-> [Field]
-> Datum (Value -> Flow s Double)
forall b u. Name -> Maybe (Datum b) -> [Field] -> Datum (u -> b)
match Name
Json._Value (Datum (Flow s Double) -> Maybe (Datum (Flow s Double))
forall a. a -> Maybe a
Just (Datum (Flow s Double) -> Maybe (Datum (Flow s Double)))
-> Datum (Flow s Double) -> Maybe (Datum (Flow s Double))
forall a b. (a -> b) -> a -> b
$ Datum (String -> Flow s Double)
forall s x. Datum (String -> Flow s x)
Flows.fail Datum (String -> Flow s Double)
-> Datum String -> Datum (Flow s Double)
forall a b. Datum (a -> b) -> Datum a -> Datum b
@@ Datum String
"expected a number") [
    Name
Json._Value_numberName -> Datum (Any -> Flow Any Any) -> Field
forall a. Name -> Datum a -> Field
>>: Datum (Any -> Flow Any Any)
forall x s. Datum (x -> Flow s x)
Flows.pure]

decodeBooleanDef :: Definition (Json.Value -> Flow s Bool)
decodeBooleanDef :: forall s. Definition (Value -> Flow s Bool)
decodeBooleanDef  = String
-> Datum (Value -> Flow s Bool)
-> Definition (Value -> Flow s Bool)
forall a. String -> Datum a -> Definition a
jsonDecodingDefinition String
"Boolean" (Datum (Value -> Flow s Bool) -> Definition (Value -> Flow s Bool))
-> Datum (Value -> Flow s Bool)
-> Definition (Value -> Flow s Bool)
forall a b. (a -> b) -> a -> b
$
  Type
-> Type
-> Datum (Value -> Flow s Bool)
-> Datum (Value -> Flow s Bool)
forall a. Type -> Type -> Datum a -> Datum a
function Type
valueT (Type -> Type -> Type
flowT Type
sT Type
booleanT) (Datum (Value -> Flow s Bool) -> Datum (Value -> Flow s Bool))
-> Datum (Value -> Flow s Bool) -> Datum (Value -> Flow s Bool)
forall a b. (a -> b) -> a -> b
$
  Name
-> Maybe (Datum (Flow s Bool))
-> [Field]
-> Datum (Value -> Flow s Bool)
forall b u. Name -> Maybe (Datum b) -> [Field] -> Datum (u -> b)
match Name
Json._Value (Datum (Flow s Bool) -> Maybe (Datum (Flow s Bool))
forall a. a -> Maybe a
Just (Datum (Flow s Bool) -> Maybe (Datum (Flow s Bool)))
-> Datum (Flow s Bool) -> Maybe (Datum (Flow s Bool))
forall a b. (a -> b) -> a -> b
$ Datum (String -> Flow s Bool)
forall s x. Datum (String -> Flow s x)
Flows.fail Datum (String -> Flow s Bool)
-> Datum String -> Datum (Flow s Bool)
forall a b. Datum (a -> b) -> Datum a -> Datum b
@@ Datum String
"expected a boolean") [
    Name
Json._Value_booleanName -> Datum (Any -> Flow Any Any) -> Field
forall a. Name -> Datum a -> Field
>>: Datum (Any -> Flow Any Any)
forall x s. Datum (x -> Flow s x)
Flows.pure]

decodeArrayDef :: Definition ((Json.Value -> Flow s a) -> Json.Value -> Flow s [a])
decodeArrayDef :: forall s a. Definition ((Value -> Flow s a) -> Value -> Flow s [a])
decodeArrayDef  = String
-> Datum ((Value -> Flow s a) -> Value -> Flow s [a])
-> Definition ((Value -> Flow s a) -> Value -> Flow s [a])
forall a. String -> Datum a -> Definition a
jsonDecodingDefinition String
"Array" (Datum ((Value -> Flow s a) -> Value -> Flow s [a])
 -> Definition ((Value -> Flow s a) -> Value -> Flow s [a]))
-> Datum ((Value -> Flow s a) -> Value -> Flow s [a])
-> Definition ((Value -> Flow s a) -> Value -> Flow s [a])
forall a b. (a -> b) -> a -> b
$
  Type
-> Type
-> Datum ((Value -> Flow s a) -> Value -> Flow s [a])
-> Datum ((Value -> Flow s a) -> Value -> Flow s [a])
forall a. Type -> Type -> Datum a -> Datum a
function (Type -> Type -> Type
funT Type
valueT (Type -> Type -> Type
flowT Type
sT Type
aT)) (Type -> Type -> Type
funT Type
valueT (Type -> Type -> Type
flowT Type
sT (Type -> Type
listT Type
aT))) (Datum ((Value -> Flow s a) -> Value -> Flow s [a])
 -> Datum ((Value -> Flow s a) -> Value -> Flow s [a]))
-> Datum ((Value -> Flow s a) -> Value -> Flow s [a])
-> Datum ((Value -> Flow s a) -> Value -> Flow s [a])
forall a b. (a -> b) -> a -> b
$
  String
-> Datum (Any -> Flow Any Any)
-> Datum ((Value -> Flow s a) -> Value -> Flow s [a])
forall x a b. String -> Datum x -> Datum (a -> b)
lambda String
"decodeElem" (Datum (Any -> Flow Any Any)
 -> Datum ((Value -> Flow s a) -> Value -> Flow s [a]))
-> Datum (Any -> Flow Any Any)
-> Datum ((Value -> Flow s a) -> Value -> Flow s [a])
forall a b. (a -> b) -> a -> b
$ Name
-> Maybe (Datum (Flow Any Any))
-> [Field]
-> Datum (Any -> Flow Any Any)
forall b u. Name -> Maybe (Datum b) -> [Field] -> Datum (u -> b)
match Name
Json._Value (Datum (Flow Any Any) -> Maybe (Datum (Flow Any Any))
forall a. a -> Maybe a
Just (Datum (Flow Any Any) -> Maybe (Datum (Flow Any Any)))
-> Datum (Flow Any Any) -> Maybe (Datum (Flow Any Any))
forall a b. (a -> b) -> a -> b
$ Datum (String -> Flow Any Any)
forall s x. Datum (String -> Flow s x)
Flows.fail Datum (String -> Flow Any Any)
-> Datum String -> Datum (Flow Any Any)
forall a b. Datum (a -> b) -> Datum a -> Datum b
@@ Datum String
"expected an array") [
    Name
Json._Value_arrayName -> Datum ([Any] -> Flow Any [Any]) -> Field
forall a. Name -> Datum a -> Field
>>: Datum ((Any -> Flow Any Any) -> [Any] -> Flow Any [Any])
forall x s y. Datum ((x -> Flow s y) -> [x] -> Flow s [y])
Flows.mapList Datum ((Any -> Flow Any Any) -> [Any] -> Flow Any [Any])
-> Datum (Any -> Flow Any Any) -> Datum ([Any] -> Flow Any [Any])
forall a b. Datum (a -> b) -> Datum a -> Datum b
@@ (String -> Datum (Any -> Flow Any Any)
forall a. String -> Datum a
var String
"decodeElem")]

decodeObjectDef :: Definition (Json.Value -> Flow s (M.Map String Json.Value))
decodeObjectDef :: forall s. Definition (Value -> Flow s (Map String Value))
decodeObjectDef  = String
-> Datum (Value -> Flow s (Map String Value))
-> Definition (Value -> Flow s (Map String Value))
forall a. String -> Datum a -> Definition a
jsonDecodingDefinition String
"Object" (Datum (Value -> Flow s (Map String Value))
 -> Definition (Value -> Flow s (Map String Value)))
-> Datum (Value -> Flow s (Map String Value))
-> Definition (Value -> Flow s (Map String Value))
forall a b. (a -> b) -> a -> b
$
  Type
-> Type
-> Datum (Value -> Flow s (Map String Value))
-> Datum (Value -> Flow s (Map String Value))
forall a. Type -> Type -> Datum a -> Datum a
function Type
valueT (Type -> Type -> Type
flowT Type
sT (Type -> Type -> Type
mapT Type
stringT Type
valueT)) (Datum (Value -> Flow s (Map String Value))
 -> Datum (Value -> Flow s (Map String Value)))
-> Datum (Value -> Flow s (Map String Value))
-> Datum (Value -> Flow s (Map String Value))
forall a b. (a -> b) -> a -> b
$
  Name
-> Maybe (Datum (Flow s (Map String Value)))
-> [Field]
-> Datum (Value -> Flow s (Map String Value))
forall b u. Name -> Maybe (Datum b) -> [Field] -> Datum (u -> b)
match Name
Json._Value (Datum (Flow s (Map String Value))
-> Maybe (Datum (Flow s (Map String Value)))
forall a. a -> Maybe a
Just (Datum (Flow s (Map String Value))
 -> Maybe (Datum (Flow s (Map String Value))))
-> Datum (Flow s (Map String Value))
-> Maybe (Datum (Flow s (Map String Value)))
forall a b. (a -> b) -> a -> b
$ Datum (String -> Flow s (Map String Value))
forall s x. Datum (String -> Flow s x)
Flows.fail Datum (String -> Flow s (Map String Value))
-> Datum String -> Datum (Flow s (Map String Value))
forall a b. Datum (a -> b) -> Datum a -> Datum b
@@ Datum String
"expected an object") [
    Name
Json._Value_objectName -> Datum (Any -> Flow Any Any) -> Field
forall a. Name -> Datum a -> Field
>>: Datum (Any -> Flow Any Any)
forall x s. Datum (x -> Flow s x)
Flows.pure]

decodeFieldDef :: Definition ((Json.Value -> Flow s a) -> String -> (M.Map String Json.Value) -> Flow s a)
decodeFieldDef :: forall s a.
Definition
  ((Value -> Flow s a) -> String -> Map String Value -> Flow s a)
decodeFieldDef  = String
-> Datum
     ((Value -> Flow s a) -> String -> Map String Value -> Flow s a)
-> Definition
     ((Value -> Flow s a) -> String -> Map String Value -> Flow s a)
forall a. String -> Datum a -> Definition a
jsonDecodingDefinition String
"Field" (Datum
   ((Value -> Flow s a) -> String -> Map String Value -> Flow s a)
 -> Definition
      ((Value -> Flow s a) -> String -> Map String Value -> Flow s a))
-> Datum
     ((Value -> Flow s a) -> String -> Map String Value -> Flow s a)
-> Definition
     ((Value -> Flow s a) -> String -> Map String Value -> Flow s a)
forall a b. (a -> b) -> a -> b
$
  Type
-> Type
-> Datum
     ((Value -> Flow s a) -> String -> Map String Value -> Flow s a)
-> Datum
     ((Value -> Flow s a) -> String -> Map String Value -> Flow s a)
forall a. Type -> Type -> Datum a -> Datum a
function (Type -> Type -> Type
funT Type
valueT (Type -> Type -> Type
flowT Type
sT Type
aT)) (Type -> Type -> Type
funT Type
stringT (Type -> Type -> Type
funT (Type -> Type -> Type
mapT Type
stringT Type
valueT) (Type -> Type -> Type
flowT Type
sT Type
aT))) (Datum
   ((Value -> Flow s a) -> String -> Map String Value -> Flow s a)
 -> Datum
      ((Value -> Flow s a) -> String -> Map String Value -> Flow s a))
-> Datum
     ((Value -> Flow s a) -> String -> Map String Value -> Flow s a)
-> Datum
     ((Value -> Flow s a) -> String -> Map String Value -> Flow s a)
forall a b. (a -> b) -> a -> b
$
  String
-> Datum (Any -> Any)
-> Datum
     ((Value -> Flow s a) -> String -> Map String Value -> Flow s a)
forall x a b. String -> Datum x -> Datum (a -> b)
lambda String
"decodeValue" (Datum (Any -> Any)
 -> Datum
      ((Value -> Flow s a) -> String -> Map String Value -> Flow s a))
-> Datum (Any -> Any)
-> Datum
     ((Value -> Flow s a) -> String -> Map String Value -> Flow s a)
forall a b. (a -> b) -> a -> b
$ String -> Datum (Any -> Any) -> Datum (Any -> Any)
forall x a b. String -> Datum x -> Datum (a -> b)
lambda String
"name" (Datum (Any -> Any) -> Datum (Any -> Any))
-> Datum (Any -> Any) -> Datum (Any -> Any)
forall a b. (a -> b) -> a -> b
$ String -> Datum (Flow Any Any) -> Datum (Any -> Any)
forall x a b. String -> Datum x -> Datum (a -> b)
lambda String
"m" (Datum (Flow Any Any) -> Datum (Any -> Any))
-> Datum (Flow Any Any) -> Datum (Any -> Any)
forall a b. (a -> b) -> a -> b
$
    Datum
  (Flow Any (Maybe Any)
   -> (Maybe Any -> Flow Any Any) -> Flow Any Any)
forall s x y. Datum (Flow s x -> (x -> Flow s y) -> Flow s y)
Flows.bind
      Datum
  (Flow Any (Maybe Any)
   -> (Maybe Any -> Flow Any Any) -> Flow Any Any)
-> Datum (Flow Any (Maybe Any))
-> Datum ((Maybe Any -> Flow Any Any) -> Flow Any Any)
forall a b. Datum (a -> b) -> Datum a -> Datum b
@@ (Definition
  ((Value -> Flow Any Any)
   -> String -> Map String Value -> Flow Any (Maybe Any))
-> Datum
     ((Value -> Flow Any Any)
      -> String -> Map String Value -> Flow Any (Maybe Any))
forall a. Definition a -> Datum a
ref Definition
  ((Value -> Flow Any Any)
   -> String -> Map String Value -> Flow Any (Maybe Any))
forall s a.
Definition
  ((Value -> Flow s a)
   -> String -> Map String Value -> Flow s (Maybe a))
decodeOptionalFieldDef Datum
  ((Value -> Flow Any Any)
   -> String -> Map String Value -> Flow Any (Maybe Any))
-> Datum (Value -> Flow Any Any)
-> Datum (String -> Map String Value -> Flow Any (Maybe Any))
forall a b. Datum (a -> b) -> Datum a -> Datum b
@@ String -> Datum (Value -> Flow Any Any)
forall a. String -> Datum a
var String
"decodeValue" Datum (String -> Map String Value -> Flow Any (Maybe Any))
-> Datum String -> Datum (Map String Value -> Flow Any (Maybe Any))
forall a b. Datum (a -> b) -> Datum a -> Datum b
@@ String -> Datum String
forall a. String -> Datum a
var String
"name" Datum (Map String Value -> Flow Any (Maybe Any))
-> Datum (Map String Value) -> Datum (Flow Any (Maybe Any))
forall a b. Datum (a -> b) -> Datum a -> Datum b
@@ String -> Datum (Map String Value)
forall a. String -> Datum a
var String
"m")
      Datum ((Maybe Any -> Flow Any Any) -> Flow Any Any)
-> Datum (Maybe Any -> Flow Any Any) -> Datum (Flow Any Any)
forall a b. Datum (a -> b) -> Datum a -> Datum b
@@ (Datum (Flow Any Any)
-> Datum (Any -> Flow Any Any) -> Datum (Maybe Any -> Flow Any Any)
forall b a. Datum b -> Datum (a -> b) -> Datum (Maybe a -> b)
matchOpt (Datum (String -> Flow Any Any)
forall s x. Datum (String -> Flow s x)
Flows.fail Datum (String -> Flow Any Any)
-> Datum String -> Datum (Flow Any Any)
forall a b. Datum (a -> b) -> Datum a -> Datum b
@@ (Datum String
"missing field: " Datum String -> Datum String -> Datum String
++ String -> Datum String
forall a. String -> Datum a
var String
"name")) Datum (Any -> Flow Any Any)
forall x s. Datum (x -> Flow s x)
Flows.pure)

decodeOptionalFieldDef :: Definition ((Json.Value -> Flow s a) -> String -> (M.Map String Json.Value) -> Flow s (Maybe a))
decodeOptionalFieldDef :: forall s a.
Definition
  ((Value -> Flow s a)
   -> String -> Map String Value -> Flow s (Maybe a))
decodeOptionalFieldDef  = String
-> Datum
     ((Value -> Flow s a)
      -> String -> Map String Value -> Flow s (Maybe a))
-> Definition
     ((Value -> Flow s a)
      -> String -> Map String Value -> Flow s (Maybe a))
forall a. String -> Datum a -> Definition a
jsonDecodingDefinition String
"OptionalField" (Datum
   ((Value -> Flow s a)
    -> String -> Map String Value -> Flow s (Maybe a))
 -> Definition
      ((Value -> Flow s a)
       -> String -> Map String Value -> Flow s (Maybe a)))
-> Datum
     ((Value -> Flow s a)
      -> String -> Map String Value -> Flow s (Maybe a))
-> Definition
     ((Value -> Flow s a)
      -> String -> Map String Value -> Flow s (Maybe a))
forall a b. (a -> b) -> a -> b
$
  Type
-> Type
-> Datum
     ((Value -> Flow s a)
      -> String -> Map String Value -> Flow s (Maybe a))
-> Datum
     ((Value -> Flow s a)
      -> String -> Map String Value -> Flow s (Maybe a))
forall a. Type -> Type -> Datum a -> Datum a
function (Type -> Type -> Type
funT Type
valueT (Type -> Type -> Type
flowT Type
sT Type
aT)) (Type -> Type -> Type
funT Type
stringT (Type -> Type -> Type
funT (Type -> Type -> Type
mapT Type
stringT Type
valueT) (Type -> Type -> Type
flowT Type
sT (Type -> Type
Types.optional Type
aT)))) (Datum
   ((Value -> Flow s a)
    -> String -> Map String Value -> Flow s (Maybe a))
 -> Datum
      ((Value -> Flow s a)
       -> String -> Map String Value -> Flow s (Maybe a)))
-> Datum
     ((Value -> Flow s a)
      -> String -> Map String Value -> Flow s (Maybe a))
-> Datum
     ((Value -> Flow s a)
      -> String -> Map String Value -> Flow s (Maybe a))
forall a b. (a -> b) -> a -> b
$
  String
-> Datum (Any -> Any)
-> Datum
     ((Value -> Flow s a)
      -> String -> Map String Value -> Flow s (Maybe a))
forall x a b. String -> Datum x -> Datum (a -> b)
lambda String
"decodeValue" (Datum (Any -> Any)
 -> Datum
      ((Value -> Flow s a)
       -> String -> Map String Value -> Flow s (Maybe a)))
-> Datum (Any -> Any)
-> Datum
     ((Value -> Flow s a)
      -> String -> Map String Value -> Flow s (Maybe a))
forall a b. (a -> b) -> a -> b
$ String -> Datum (Any -> Any) -> Datum (Any -> Any)
forall x a b. String -> Datum x -> Datum (a -> b)
lambda String
"name" (Datum (Any -> Any) -> Datum (Any -> Any))
-> Datum (Any -> Any) -> Datum (Any -> Any)
forall a b. (a -> b) -> a -> b
$ String -> Datum (Flow Any Any) -> Datum (Any -> Any)
forall x a b. String -> Datum x -> Datum (a -> b)
lambda String
"m" (Datum (Flow Any Any) -> Datum (Any -> Any))
-> Datum (Flow Any Any) -> Datum (Any -> Any)
forall a b. (a -> b) -> a -> b
$
    (Datum (Flow Any Any)
-> Datum (Any -> Flow Any Any) -> Datum (Maybe Any -> Flow Any Any)
forall b a. Datum b -> Datum (a -> b) -> Datum (Maybe a -> b)
matchOpt (Datum (Any -> Flow Any Any)
forall x s. Datum (x -> Flow s x)
Flows.pure Datum (Any -> Flow Any Any) -> Datum Any -> Datum (Flow Any Any)
forall a b. Datum (a -> b) -> Datum a -> Datum b
@@ Datum Any
forall x. Datum x
nothing) (String -> Datum (Flow Any Any) -> Datum (Any -> Flow Any Any)
forall x a b. String -> Datum x -> Datum (a -> b)
lambda String
"v" (Datum ((Any -> Any) -> Flow Any Any -> Flow Any Any)
forall x y s. Datum ((x -> y) -> Flow s x -> Flow s y)
Flows.map Datum ((Any -> Any) -> Flow Any Any -> Flow Any Any)
-> Datum (Any -> Any) -> Datum (Flow Any Any -> Flow Any Any)
forall a b. Datum (a -> b) -> Datum a -> Datum b
@@ (String -> Datum (Maybe Any) -> Datum (Any -> Any)
forall x a b. String -> Datum x -> Datum (a -> b)
lambda String
"x" (Datum Any -> Datum (Maybe Any)
forall x. Datum x -> Datum (Maybe x)
just (Datum Any -> Datum (Maybe Any)) -> Datum Any -> Datum (Maybe Any)
forall a b. (a -> b) -> a -> b
$ String -> Datum Any
forall a. String -> Datum a
var String
"x")) Datum (Flow Any Any -> Flow Any Any)
-> Datum (Flow Any Any) -> Datum (Flow Any Any)
forall a b. Datum (a -> b) -> Datum a -> Datum b
@@ (String -> Datum (Any -> Flow Any Any)
forall a. String -> Datum a
var String
"decodeValue" Datum (Any -> Flow Any Any) -> Datum Any -> Datum (Flow Any Any)
forall a b. Datum (a -> b) -> Datum a -> Datum b
@@ String -> Datum Any
forall a. String -> Datum a
var String
"v"))))
      Datum (Maybe Any -> Flow Any Any)
-> Datum (Maybe Any) -> Datum (Flow Any Any)
forall a b. Datum (a -> b) -> Datum a -> Datum b
@@ (Datum (Any -> Map Any Any -> Maybe Any)
forall k v. Datum (k -> Map k v -> Maybe v)
Maps.lookup Datum (Any -> Map Any Any -> Maybe Any)
-> Datum Any -> Datum (Map Any Any -> Maybe Any)
forall a b. Datum (a -> b) -> Datum a -> Datum b
@@ String -> Datum Any
forall a. String -> Datum a
var String
"name" Datum (Map Any Any -> Maybe Any)
-> Datum (Map Any Any) -> Datum (Maybe Any)
forall a b. Datum (a -> b) -> Datum a -> Datum b
@@ String -> Datum (Map Any Any)
forall a. String -> Datum a
var String
"m")