{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GeneralisedNewtypeDeriving #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuantifiedConstraints #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# OPTIONS_GHC -fno-warn-incomplete-patterns #-}

module Composite.Dhall (TextTemplate (TextTemplate, unTextTemplate), runTextTemplate) where

import Composite.Record
import Control.Applicative
import Data.Functor.Contravariant
import Data.Text (Text)
import Data.Void
import qualified Dhall as D
import Dhall.Core hiding (File, Text)
import Dhall.Map
import Dhall.Src
import GHC.TypeLits

unsafeExpectRecordLit ::
  Text -> Expr Src Void -> Dhall.Map.Map Text (RecordField Src Void)
unsafeExpectRecordLit :: Text -> Expr Src Void -> Map Text (RecordField Src Void)
unsafeExpectRecordLit Text
_ (RecordLit Map Text (RecordField Src Void)
kvs) =
  Map Text (RecordField Src Void)
kvs
unsafeExpectRecordLit Text
name Expr Src Void
expression =
  Text -> forall b. b
Dhall.Core.internalError
    (Text
name Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
": Unexpected constructor: " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Expr Src Void -> Text
forall a. Pretty a => a -> Text
Dhall.Core.pretty Expr Src Void
expression)

unsafeExpectRecord ::
  Text -> Expr Src Void -> Dhall.Map.Map Text (RecordField Src Void)
unsafeExpectRecord :: Text -> Expr Src Void -> Map Text (RecordField Src Void)
unsafeExpectRecord Text
_ (Record Map Text (RecordField Src Void)
kts) =
  Map Text (RecordField Src Void)
kts
unsafeExpectRecord Text
name Expr Src Void
expression =
  Text -> forall b. b
Dhall.Core.internalError
    (Text
name Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
": Unexpected constructor: " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Expr Src Void -> Text
forall a. Pretty a => a -> Text
Dhall.Core.pretty Expr Src Void
expression)

-- ToDhall

instance D.ToDhall (Rec f '[]) where
  injectWith :: InputNormalizer -> Encoder (Rec f '[])
injectWith = Encoder (Rec f '[]) -> InputNormalizer -> Encoder (Rec f '[])
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Encoder :: forall a. (a -> Expr Src Void) -> Expr Src Void -> Encoder a
D.Encoder {Expr Src Void
Rec f '[] -> Expr Src Void
forall s a. Expr s a
forall p s a. p -> Expr s a
embed :: Rec f '[] -> Expr Src Void
declared :: Expr Src Void
declared :: forall s a. Expr s a
embed :: forall p s a. p -> Expr s a
..})
    where
      embed :: p -> Expr s a
embed p
_ = Map Text (RecordField s a) -> Expr s a
forall s a. Map Text (RecordField s a) -> Expr s a
RecordLit Map Text (RecordField s a)
forall a. Monoid a => a
mempty
      declared :: Expr s a
declared = Map Text (RecordField s a) -> Expr s a
forall s a. Map Text (RecordField s a) -> Expr s a
Record Map Text (RecordField s a)
forall a. Monoid a => a
mempty

-- Identity

instance (KnownSymbol s, D.ToDhall (Record xs), D.ToDhall x) => D.ToDhall (Record (s :-> x ': xs)) where
  injectWith :: InputNormalizer -> Encoder (Record ((s :-> x) : xs))
injectWith = do
    let f :: s :-> x
        f :: s :-> x
f = s :-> x
forall a. HasCallStack => a
undefined
    let name :: Text
name = (s :-> x) -> Text
forall (s :: Symbol) a. KnownSymbol s => (s :-> a) -> Text
valName s :-> x
f
    let D.Encoder x -> Expr Src Void
embedL Expr Src Void
declaredL = Encoder x
forall a. ToDhall a => Encoder a
D.inject
    let D.Encoder Record xs -> Expr Src Void
embedR Expr Src Void
declaredR = Encoder (Record xs)
forall a. ToDhall a => Encoder a
D.inject
    let embed :: Record ((s :-> x) : xs) -> Expr Src Void
embed (x
s :*: Record xs
xs) = Map Text (RecordField Src Void) -> Expr Src Void
forall s a. Map Text (RecordField s a) -> Expr s a
RecordLit (Text
-> RecordField Src Void
-> Map Text (RecordField Src Void)
-> Map Text (RecordField Src Void)
forall k v. Ord k => k -> v -> Map k v -> Map k v
Dhall.Map.insert Text
name (Expr Src Void -> RecordField Src Void
forall s a. Expr s a -> RecordField s a
Dhall.Core.makeRecordField (x -> Expr Src Void
embedL x
s)) Map Text (RecordField Src Void)
mapR)
          where
            mapR :: Map Text (RecordField Src Void)
mapR = Text -> Expr Src Void -> Map Text (RecordField Src Void)
unsafeExpectRecordLit Text
"Composite Record" (Expr Src Void -> Map Text (RecordField Src Void))
-> Expr Src Void -> Map Text (RecordField Src Void)
forall a b. (a -> b) -> a -> b
$ Record xs -> Expr Src Void
embedR Record xs
xs
    let declared :: Expr Src Void
declared = Map Text (RecordField Src Void) -> Expr Src Void
forall s a. Map Text (RecordField s a) -> Expr s a
Record (Text
-> RecordField Src Void
-> Map Text (RecordField Src Void)
-> Map Text (RecordField Src Void)
forall k v. Ord k => k -> v -> Map k v -> Map k v
Dhall.Map.insert Text
name (Expr Src Void -> RecordField Src Void
forall s a. Expr s a -> RecordField s a
Dhall.Core.makeRecordField Expr Src Void
declaredL) Map Text (RecordField Src Void)
mapR)
          where
            mapR :: Map Text (RecordField Src Void)
mapR = Text -> Expr Src Void -> Map Text (RecordField Src Void)
unsafeExpectRecord Text
"Composite Record" Expr Src Void
declaredR
    Encoder (Record ((s :-> x) : xs))
-> InputNormalizer -> Encoder (Record ((s :-> x) : xs))
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Encoder (Record ((s :-> x) : xs))
 -> InputNormalizer -> Encoder (Record ((s :-> x) : xs)))
-> Encoder (Record ((s :-> x) : xs))
-> InputNormalizer
-> Encoder (Record ((s :-> x) : xs))
forall a b. (a -> b) -> a -> b
$ Encoder :: forall a. (a -> Expr Src Void) -> Expr Src Void -> Encoder a
D.Encoder {Expr Src Void
Record ((s :-> x) : xs) -> Expr Src Void
declared :: Expr Src Void
embed :: Record ((s :-> x) : xs) -> Expr Src Void
embed :: Record ((s :-> x) : xs) -> Expr Src Void
declared :: Expr Src Void
..}

-- Maybe

instance (KnownSymbol s, D.ToDhall (Rec Maybe xs), D.ToDhall x) => D.ToDhall (Rec Maybe (s :-> x ': xs)) where
  injectWith :: InputNormalizer -> Encoder (Rec Maybe ((s :-> x) : xs))
injectWith = do
    let f :: s :-> x
        f :: s :-> x
f = s :-> x
forall a. HasCallStack => a
undefined
    let name :: Text
name = (s :-> x) -> Text
forall (s :: Symbol) a. KnownSymbol s => (s :-> a) -> Text
valName s :-> x
f
    let D.Encoder Maybe x -> Expr Src Void
embedL Expr Src Void
declaredL = Encoder (Maybe x)
forall a. ToDhall a => Encoder a
D.inject
    let D.Encoder Rec Maybe xs -> Expr Src Void
embedR Expr Src Void
declaredR = Encoder (Rec Maybe xs)
forall a. ToDhall a => Encoder a
D.inject
    let embed :: Rec Maybe ((s :-> x) : xs) -> Expr Src Void
embed (Maybe x
s :^: Rec Maybe xs
xs) = Map Text (RecordField Src Void) -> Expr Src Void
forall s a. Map Text (RecordField s a) -> Expr s a
RecordLit (Text
-> RecordField Src Void
-> Map Text (RecordField Src Void)
-> Map Text (RecordField Src Void)
forall k v. Ord k => k -> v -> Map k v -> Map k v
Dhall.Map.insert Text
name (Expr Src Void -> RecordField Src Void
forall s a. Expr s a -> RecordField s a
Dhall.Core.makeRecordField (Maybe x -> Expr Src Void
embedL Maybe x
s)) Map Text (RecordField Src Void)
mapR)
          where
            mapR :: Map Text (RecordField Src Void)
mapR = Text -> Expr Src Void -> Map Text (RecordField Src Void)
unsafeExpectRecordLit Text
"Composite Record" (Expr Src Void -> Map Text (RecordField Src Void))
-> Expr Src Void -> Map Text (RecordField Src Void)
forall a b. (a -> b) -> a -> b
$ Rec Maybe xs -> Expr Src Void
embedR Rec Maybe xs
xs
    let declared :: Expr Src Void
declared = Map Text (RecordField Src Void) -> Expr Src Void
forall s a. Map Text (RecordField s a) -> Expr s a
Record (Text
-> RecordField Src Void
-> Map Text (RecordField Src Void)
-> Map Text (RecordField Src Void)
forall k v. Ord k => k -> v -> Map k v -> Map k v
Dhall.Map.insert Text
name (Expr Src Void -> RecordField Src Void
forall s a. Expr s a -> RecordField s a
Dhall.Core.makeRecordField Expr Src Void
declaredL) Map Text (RecordField Src Void)
mapR)
          where
            mapR :: Map Text (RecordField Src Void)
mapR = Text -> Expr Src Void -> Map Text (RecordField Src Void)
unsafeExpectRecord Text
"Composite Record" Expr Src Void
declaredR
    Encoder (Rec Maybe ((s :-> x) : xs))
-> InputNormalizer -> Encoder (Rec Maybe ((s :-> x) : xs))
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Encoder (Rec Maybe ((s :-> x) : xs))
 -> InputNormalizer -> Encoder (Rec Maybe ((s :-> x) : xs)))
-> Encoder (Rec Maybe ((s :-> x) : xs))
-> InputNormalizer
-> Encoder (Rec Maybe ((s :-> x) : xs))
forall a b. (a -> b) -> a -> b
$ Encoder :: forall a. (a -> Expr Src Void) -> Expr Src Void -> Encoder a
D.Encoder {Expr Src Void
Rec Maybe ((s :-> x) : xs) -> Expr Src Void
declared :: Expr Src Void
embed :: Rec Maybe ((s :-> x) : xs) -> Expr Src Void
embed :: Rec Maybe ((s :-> x) : xs) -> Expr Src Void
declared :: Expr Src Void
..}

-- List

instance (KnownSymbol s, D.ToDhall (Rec [] xs), D.ToDhall x) => D.ToDhall (Rec [] (s :-> x ': xs)) where
  injectWith :: InputNormalizer -> Encoder (Rec [] ((s :-> x) : xs))
injectWith = do
    let f :: s :-> x
        f :: s :-> x
f = s :-> x
forall a. HasCallStack => a
undefined
    let name :: Text
name = (s :-> x) -> Text
forall (s :: Symbol) a. KnownSymbol s => (s :-> a) -> Text
valName s :-> x
f
    let D.Encoder [x] -> Expr Src Void
embedL Expr Src Void
declaredL = Encoder [x]
forall a. ToDhall a => Encoder a
D.inject
    let D.Encoder Rec [] xs -> Expr Src Void
embedR Expr Src Void
declaredR = Encoder (Rec [] xs)
forall a. ToDhall a => Encoder a
D.inject
    let embed :: Rec [] ((s :-> x) : xs) -> Expr Src Void
embed ([x]
s :^: Rec [] xs
xs) = Map Text (RecordField Src Void) -> Expr Src Void
forall s a. Map Text (RecordField s a) -> Expr s a
RecordLit (Text
-> RecordField Src Void
-> Map Text (RecordField Src Void)
-> Map Text (RecordField Src Void)
forall k v. Ord k => k -> v -> Map k v -> Map k v
Dhall.Map.insert Text
name (Expr Src Void -> RecordField Src Void
forall s a. Expr s a -> RecordField s a
Dhall.Core.makeRecordField ([x] -> Expr Src Void
embedL [x]
s)) Map Text (RecordField Src Void)
mapR)
          where
            mapR :: Map Text (RecordField Src Void)
mapR = Text -> Expr Src Void -> Map Text (RecordField Src Void)
unsafeExpectRecordLit Text
"Composite Record" (Expr Src Void -> Map Text (RecordField Src Void))
-> Expr Src Void -> Map Text (RecordField Src Void)
forall a b. (a -> b) -> a -> b
$ Rec [] xs -> Expr Src Void
embedR Rec [] xs
xs
    let declared :: Expr Src Void
declared = Map Text (RecordField Src Void) -> Expr Src Void
forall s a. Map Text (RecordField s a) -> Expr s a
Record (Text
-> RecordField Src Void
-> Map Text (RecordField Src Void)
-> Map Text (RecordField Src Void)
forall k v. Ord k => k -> v -> Map k v -> Map k v
Dhall.Map.insert Text
name (Expr Src Void -> RecordField Src Void
forall s a. Expr s a -> RecordField s a
Dhall.Core.makeRecordField Expr Src Void
declaredL) Map Text (RecordField Src Void)
mapR)
          where
            mapR :: Map Text (RecordField Src Void)
mapR = Text -> Expr Src Void -> Map Text (RecordField Src Void)
unsafeExpectRecord Text
"Composite Record" Expr Src Void
declaredR
    Encoder (Rec [] ((s :-> x) : xs))
-> InputNormalizer -> Encoder (Rec [] ((s :-> x) : xs))
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Encoder (Rec [] ((s :-> x) : xs))
 -> InputNormalizer -> Encoder (Rec [] ((s :-> x) : xs)))
-> Encoder (Rec [] ((s :-> x) : xs))
-> InputNormalizer
-> Encoder (Rec [] ((s :-> x) : xs))
forall a b. (a -> b) -> a -> b
$ Encoder :: forall a. (a -> Expr Src Void) -> Expr Src Void -> Encoder a
D.Encoder {Expr Src Void
Rec [] ((s :-> x) : xs) -> Expr Src Void
declared :: Expr Src Void
embed :: Rec [] ((s :-> x) : xs) -> Expr Src Void
embed :: Rec [] ((s :-> x) : xs) -> Expr Src Void
declared :: Expr Src Void
..}

---------------------------

-- FromDhall

instance D.FromDhall (Rec f '[]) where
  autoWith :: InputNormalizer -> Decoder (Rec f '[])
autoWith InputNormalizer
_ = Decoder :: forall a.
(Expr Src Void -> Extractor Src Void a)
-> Expector (Expr Src Void) -> Decoder a
D.Decoder {Expector (Expr Src Void)
Expr Src Void -> Validation (ExtractErrors Src Void) (Rec f '[])
forall s a. Validation ExpectedTypeErrors (Expr s a)
forall (f :: * -> *) p (a :: * -> *).
Applicative f =>
p -> f (Rec a '[])
extract :: Expr Src Void -> Validation (ExtractErrors Src Void) (Rec f '[])
expected :: Expector (Expr Src Void)
expected :: forall s a. Validation ExpectedTypeErrors (Expr s a)
extract :: forall (f :: * -> *) p (a :: * -> *).
Applicative f =>
p -> f (Rec a '[])
..}
    where
      extract :: p -> f (Rec a '[])
extract p
_ = Rec a '[] -> f (Rec a '[])
forall (f :: * -> *) a. Applicative f => a -> f a
pure Rec a '[]
forall u (a :: u -> *). Rec a '[]
RNil
      expected :: Validation ExpectedTypeErrors (Expr s a)
expected = Expr s a -> Validation ExpectedTypeErrors (Expr s a)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Expr s a -> Validation ExpectedTypeErrors (Expr s a))
-> Expr s a -> Validation ExpectedTypeErrors (Expr s a)
forall a b. (a -> b) -> a -> b
$ Map Text (RecordField s a) -> Expr s a
forall s a. Map Text (RecordField s a) -> Expr s a
Record ([(Text, RecordField s a)] -> Map Text (RecordField s a)
forall k v. Ord k => [(k, v)] -> Map k v
Dhall.Map.fromList [])

-- Identity

instance (KnownSymbol s, D.FromDhall (Record xs), D.FromDhall x) => D.FromDhall (Record (s :-> x ': xs)) where
  autoWith :: InputNormalizer -> Decoder (Record ((s :-> x) : xs))
autoWith = do
    let nL :: s :-> x
        nL :: s :-> x
nL = s :-> x
forall a. HasCallStack => a
undefined

    let nameL :: Text
nameL = (s :-> x) -> Text
forall (s :: Symbol) a. KnownSymbol s => (s :-> a) -> Text
valName s :-> x
nL

    D.Decoder Expr Src Void -> Extractor Src Void x
extractL Expector (Expr Src Void)
expectedL <- FromDhall x => InputNormalizer -> Decoder x
forall a. FromDhall a => InputNormalizer -> Decoder a
D.autoWith @x

    D.Decoder Expr Src Void -> Extractor Src Void (Record xs)
extractR Expector (Expr Src Void)
expectedR <- FromDhall (Record xs) => InputNormalizer -> Decoder (Record xs)
forall a. FromDhall a => InputNormalizer -> Decoder a
D.autoWith @(Record xs)

    let ktsR :: Validation ExpectedTypeErrors (Map Text (RecordField Src Void))
ktsR = Text -> Expr Src Void -> Map Text (RecordField Src Void)
unsafeExpectRecord Text
"Composite Record" (Expr Src Void -> Map Text (RecordField Src Void))
-> Expector (Expr Src Void)
-> Validation ExpectedTypeErrors (Map Text (RecordField Src Void))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Expector (Expr Src Void)
expectedR

    let expected :: Expector (Expr Src Void)
expected = Map Text (RecordField Src Void) -> Expr Src Void
forall s a. Map Text (RecordField s a) -> Expr s a
Record (Map Text (RecordField Src Void) -> Expr Src Void)
-> Validation ExpectedTypeErrors (Map Text (RecordField Src Void))
-> Expector (Expr Src Void)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Text
-> RecordField Src Void
-> Map Text (RecordField Src Void)
-> Map Text (RecordField Src Void)
forall k v. Ord k => k -> v -> Map k v -> Map k v
Dhall.Map.insert Text
nameL (RecordField Src Void
 -> Map Text (RecordField Src Void)
 -> Map Text (RecordField Src Void))
-> (Expr Src Void -> RecordField Src Void)
-> Expr Src Void
-> Map Text (RecordField Src Void)
-> Map Text (RecordField Src Void)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Expr Src Void -> RecordField Src Void
forall s a. Expr s a -> RecordField s a
Dhall.Core.makeRecordField (Expr Src Void
 -> Map Text (RecordField Src Void)
 -> Map Text (RecordField Src Void))
-> Expector (Expr Src Void)
-> Validation
     ExpectedTypeErrors
     (Map Text (RecordField Src Void)
      -> Map Text (RecordField Src Void))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Expector (Expr Src Void)
expectedL Validation
  ExpectedTypeErrors
  (Map Text (RecordField Src Void)
   -> Map Text (RecordField Src Void))
-> Validation ExpectedTypeErrors (Map Text (RecordField Src Void))
-> Validation ExpectedTypeErrors (Map Text (RecordField Src Void))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Validation ExpectedTypeErrors (Map Text (RecordField Src Void))
ktsR)
    let extract :: Expr Src Void
-> Validation (ExtractErrors Src Void) (Record ((s :-> x) : xs))
extract Expr Src Void
expression = do
          let die :: Validation (ExtractErrors Src Void) (Record ((s :-> x) : xs))
die = Expector (Expr Src Void)
-> Expr Src Void
-> Validation (ExtractErrors Src Void) (Record ((s :-> x) : xs))
forall s a b. Expector (Expr s a) -> Expr s a -> Extractor s a b
D.typeError Expector (Expr Src Void)
expected Expr Src Void
expression

          case Expr Src Void
expression of
            RecordLit Map Text (RecordField Src Void)
kvs ->
              case RecordField Src Void -> Expr Src Void
forall s a. RecordField s a -> Expr s a
Dhall.Core.recordFieldValue (RecordField Src Void -> Expr Src Void)
-> Maybe (RecordField Src Void) -> Maybe (Expr Src Void)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Text
-> Map Text (RecordField Src Void) -> Maybe (RecordField Src Void)
forall k v. Ord k => k -> Map k v -> Maybe v
Dhall.Map.lookup Text
nameL Map Text (RecordField Src Void)
kvs of
                Just Expr Src Void
expressionL ->
                  (x -> Record xs -> Record ((s :-> x) : xs))
-> Extractor Src Void x
-> Extractor Src Void (Record xs)
-> Validation (ExtractErrors Src Void) (Record ((s :-> x) : xs))
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2
                    x -> Record xs -> Record ((s :-> x) : xs)
forall a (rs :: [*]) (s :: Symbol).
a -> Rec Identity rs -> Rec Identity ((s :-> a) : rs)
(:*:)
                    (Expr Src Void -> Extractor Src Void x
extractL Expr Src Void
expressionL)
                    (Expr Src Void -> Extractor Src Void (Record xs)
extractR Expr Src Void
expression)
                Maybe (Expr Src Void)
_ -> Validation (ExtractErrors Src Void) (Record ((s :-> x) : xs))
die
            Expr Src Void
_ -> Validation (ExtractErrors Src Void) (Record ((s :-> x) : xs))
die
    Decoder (Record ((s :-> x) : xs))
-> InputNormalizer -> Decoder (Record ((s :-> x) : xs))
forall (f :: * -> *) a. Applicative f => a -> f a
pure ((Expr Src Void
 -> Validation (ExtractErrors Src Void) (Record ((s :-> x) : xs)))
-> Expector (Expr Src Void) -> Decoder (Record ((s :-> x) : xs))
forall a.
(Expr Src Void -> Extractor Src Void a)
-> Expector (Expr Src Void) -> Decoder a
D.Decoder Expr Src Void
-> Validation (ExtractErrors Src Void) (Record ((s :-> x) : xs))
extract Expector (Expr Src Void)
expected)

-- Maybe

instance (KnownSymbol s, D.FromDhall (Rec Maybe xs), D.FromDhall x) => D.FromDhall (Rec Maybe (s :-> x ': xs)) where
  autoWith :: InputNormalizer -> Decoder (Rec Maybe ((s :-> x) : xs))
autoWith = do
    let nL :: s :-> x
        nL :: s :-> x
nL = s :-> x
forall a. HasCallStack => a
undefined

    let nameL :: Text
nameL = (s :-> x) -> Text
forall (s :: Symbol) a. KnownSymbol s => (s :-> a) -> Text
valName s :-> x
nL

    D.Decoder Expr Src Void -> Extractor Src Void (Maybe x)
extractL Expector (Expr Src Void)
expectedL <- FromDhall (Maybe x) => InputNormalizer -> Decoder (Maybe x)
forall a. FromDhall a => InputNormalizer -> Decoder a
D.autoWith @(Maybe x)

    D.Decoder Expr Src Void -> Extractor Src Void (Rec Maybe xs)
extractR Expector (Expr Src Void)
expectedR <- FromDhall (Rec Maybe xs) =>
InputNormalizer -> Decoder (Rec Maybe xs)
forall a. FromDhall a => InputNormalizer -> Decoder a
D.autoWith @(Rec Maybe xs)

    let ktsR :: Validation ExpectedTypeErrors (Map Text (RecordField Src Void))
ktsR = Text -> Expr Src Void -> Map Text (RecordField Src Void)
unsafeExpectRecord Text
"Composite Record" (Expr Src Void -> Map Text (RecordField Src Void))
-> Expector (Expr Src Void)
-> Validation ExpectedTypeErrors (Map Text (RecordField Src Void))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Expector (Expr Src Void)
expectedR

    let expected :: Expector (Expr Src Void)
expected = Map Text (RecordField Src Void) -> Expr Src Void
forall s a. Map Text (RecordField s a) -> Expr s a
Record (Map Text (RecordField Src Void) -> Expr Src Void)
-> Validation ExpectedTypeErrors (Map Text (RecordField Src Void))
-> Expector (Expr Src Void)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Text
-> RecordField Src Void
-> Map Text (RecordField Src Void)
-> Map Text (RecordField Src Void)
forall k v. Ord k => k -> v -> Map k v -> Map k v
Dhall.Map.insert Text
nameL (RecordField Src Void
 -> Map Text (RecordField Src Void)
 -> Map Text (RecordField Src Void))
-> (Expr Src Void -> RecordField Src Void)
-> Expr Src Void
-> Map Text (RecordField Src Void)
-> Map Text (RecordField Src Void)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Expr Src Void -> RecordField Src Void
forall s a. Expr s a -> RecordField s a
Dhall.Core.makeRecordField (Expr Src Void
 -> Map Text (RecordField Src Void)
 -> Map Text (RecordField Src Void))
-> Expector (Expr Src Void)
-> Validation
     ExpectedTypeErrors
     (Map Text (RecordField Src Void)
      -> Map Text (RecordField Src Void))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Expector (Expr Src Void)
expectedL Validation
  ExpectedTypeErrors
  (Map Text (RecordField Src Void)
   -> Map Text (RecordField Src Void))
-> Validation ExpectedTypeErrors (Map Text (RecordField Src Void))
-> Validation ExpectedTypeErrors (Map Text (RecordField Src Void))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Validation ExpectedTypeErrors (Map Text (RecordField Src Void))
ktsR)
    let extract :: Expr Src Void
-> Validation (ExtractErrors Src Void) (Rec Maybe ((s :-> x) : xs))
extract Expr Src Void
expression = do
          let die :: Validation (ExtractErrors Src Void) (Rec Maybe ((s :-> x) : xs))
die = Expector (Expr Src Void)
-> Expr Src Void
-> Validation (ExtractErrors Src Void) (Rec Maybe ((s :-> x) : xs))
forall s a b. Expector (Expr s a) -> Expr s a -> Extractor s a b
D.typeError Expector (Expr Src Void)
expected Expr Src Void
expression

          case Expr Src Void
expression of
            RecordLit Map Text (RecordField Src Void)
kvs ->
              case RecordField Src Void -> Expr Src Void
forall s a. RecordField s a -> Expr s a
Dhall.Core.recordFieldValue (RecordField Src Void -> Expr Src Void)
-> Maybe (RecordField Src Void) -> Maybe (Expr Src Void)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Text
-> Map Text (RecordField Src Void) -> Maybe (RecordField Src Void)
forall k v. Ord k => k -> Map k v -> Maybe v
Dhall.Map.lookup Text
nameL Map Text (RecordField Src Void)
kvs of
                Just Expr Src Void
expressionL ->
                  (Maybe x -> Rec Maybe xs -> Rec Maybe ((s :-> x) : xs))
-> Extractor Src Void (Maybe x)
-> Extractor Src Void (Rec Maybe xs)
-> Validation (ExtractErrors Src Void) (Rec Maybe ((s :-> x) : xs))
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2
                    Maybe x -> Rec Maybe xs -> Rec Maybe ((s :-> x) : xs)
forall (f :: * -> *) a (rs :: [*]) (s :: Symbol).
Functor f =>
f a -> Rec f rs -> Rec f ((s :-> a) : rs)
(:^:)
                    (Expr Src Void -> Extractor Src Void (Maybe x)
extractL Expr Src Void
expressionL)
                    (Expr Src Void -> Extractor Src Void (Rec Maybe xs)
extractR Expr Src Void
expression)
                Maybe (Expr Src Void)
_ -> Validation (ExtractErrors Src Void) (Rec Maybe ((s :-> x) : xs))
die
            Expr Src Void
_ -> Validation (ExtractErrors Src Void) (Rec Maybe ((s :-> x) : xs))
die
    Decoder (Rec Maybe ((s :-> x) : xs))
-> InputNormalizer -> Decoder (Rec Maybe ((s :-> x) : xs))
forall (f :: * -> *) a. Applicative f => a -> f a
pure ((Expr Src Void
 -> Validation
      (ExtractErrors Src Void) (Rec Maybe ((s :-> x) : xs)))
-> Expector (Expr Src Void) -> Decoder (Rec Maybe ((s :-> x) : xs))
forall a.
(Expr Src Void -> Extractor Src Void a)
-> Expector (Expr Src Void) -> Decoder a
D.Decoder Expr Src Void
-> Validation (ExtractErrors Src Void) (Rec Maybe ((s :-> x) : xs))
extract Expector (Expr Src Void)
expected)

-- List

instance (KnownSymbol s, D.FromDhall (Rec [] xs), D.FromDhall x) => D.FromDhall (Rec [] (s :-> x ': xs)) where
  autoWith :: InputNormalizer -> Decoder (Rec [] ((s :-> x) : xs))
autoWith = do
    let nL :: s :-> x
        nL :: s :-> x
nL = s :-> x
forall a. HasCallStack => a
undefined

    let nameL :: Text
nameL = (s :-> x) -> Text
forall (s :: Symbol) a. KnownSymbol s => (s :-> a) -> Text
valName s :-> x
nL

    D.Decoder Expr Src Void -> Extractor Src Void [x]
extractL Expector (Expr Src Void)
expectedL <- FromDhall [x] => InputNormalizer -> Decoder [x]
forall a. FromDhall a => InputNormalizer -> Decoder a
D.autoWith @[x]

    D.Decoder Expr Src Void -> Extractor Src Void (Rec [] xs)
extractR Expector (Expr Src Void)
expectedR <- FromDhall (Rec [] xs) => InputNormalizer -> Decoder (Rec [] xs)
forall a. FromDhall a => InputNormalizer -> Decoder a
D.autoWith @(Rec [] xs)

    let ktsR :: Validation ExpectedTypeErrors (Map Text (RecordField Src Void))
ktsR = Text -> Expr Src Void -> Map Text (RecordField Src Void)
unsafeExpectRecord Text
"Composite Record" (Expr Src Void -> Map Text (RecordField Src Void))
-> Expector (Expr Src Void)
-> Validation ExpectedTypeErrors (Map Text (RecordField Src Void))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Expector (Expr Src Void)
expectedR

    let expected :: Expector (Expr Src Void)
expected = Map Text (RecordField Src Void) -> Expr Src Void
forall s a. Map Text (RecordField s a) -> Expr s a
Record (Map Text (RecordField Src Void) -> Expr Src Void)
-> Validation ExpectedTypeErrors (Map Text (RecordField Src Void))
-> Expector (Expr Src Void)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Text
-> RecordField Src Void
-> Map Text (RecordField Src Void)
-> Map Text (RecordField Src Void)
forall k v. Ord k => k -> v -> Map k v -> Map k v
Dhall.Map.insert Text
nameL (RecordField Src Void
 -> Map Text (RecordField Src Void)
 -> Map Text (RecordField Src Void))
-> (Expr Src Void -> RecordField Src Void)
-> Expr Src Void
-> Map Text (RecordField Src Void)
-> Map Text (RecordField Src Void)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Expr Src Void -> RecordField Src Void
forall s a. Expr s a -> RecordField s a
Dhall.Core.makeRecordField (Expr Src Void
 -> Map Text (RecordField Src Void)
 -> Map Text (RecordField Src Void))
-> Expector (Expr Src Void)
-> Validation
     ExpectedTypeErrors
     (Map Text (RecordField Src Void)
      -> Map Text (RecordField Src Void))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Expector (Expr Src Void)
expectedL Validation
  ExpectedTypeErrors
  (Map Text (RecordField Src Void)
   -> Map Text (RecordField Src Void))
-> Validation ExpectedTypeErrors (Map Text (RecordField Src Void))
-> Validation ExpectedTypeErrors (Map Text (RecordField Src Void))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Validation ExpectedTypeErrors (Map Text (RecordField Src Void))
ktsR)
    let extract :: Expr Src Void
-> Validation (ExtractErrors Src Void) (Rec [] ((s :-> x) : xs))
extract Expr Src Void
expression = do
          let die :: Validation (ExtractErrors Src Void) (Rec [] ((s :-> x) : xs))
die = Expector (Expr Src Void)
-> Expr Src Void
-> Validation (ExtractErrors Src Void) (Rec [] ((s :-> x) : xs))
forall s a b. Expector (Expr s a) -> Expr s a -> Extractor s a b
D.typeError Expector (Expr Src Void)
expected Expr Src Void
expression

          case Expr Src Void
expression of
            RecordLit Map Text (RecordField Src Void)
kvs ->
              case RecordField Src Void -> Expr Src Void
forall s a. RecordField s a -> Expr s a
Dhall.Core.recordFieldValue (RecordField Src Void -> Expr Src Void)
-> Maybe (RecordField Src Void) -> Maybe (Expr Src Void)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Text
-> Map Text (RecordField Src Void) -> Maybe (RecordField Src Void)
forall k v. Ord k => k -> Map k v -> Maybe v
Dhall.Map.lookup Text
nameL Map Text (RecordField Src Void)
kvs of
                Just Expr Src Void
expressionL ->
                  ([x] -> Rec [] xs -> Rec [] ((s :-> x) : xs))
-> Extractor Src Void [x]
-> Extractor Src Void (Rec [] xs)
-> Validation (ExtractErrors Src Void) (Rec [] ((s :-> x) : xs))
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2
                    [x] -> Rec [] xs -> Rec [] ((s :-> x) : xs)
forall (f :: * -> *) a (rs :: [*]) (s :: Symbol).
Functor f =>
f a -> Rec f rs -> Rec f ((s :-> a) : rs)
(:^:)
                    (Expr Src Void -> Extractor Src Void [x]
extractL Expr Src Void
expressionL)
                    (Expr Src Void -> Extractor Src Void (Rec [] xs)
extractR Expr Src Void
expression)
                Maybe (Expr Src Void)
_ -> Validation (ExtractErrors Src Void) (Rec [] ((s :-> x) : xs))
die
            Expr Src Void
_ -> Validation (ExtractErrors Src Void) (Rec [] ((s :-> x) : xs))
die
    Decoder (Rec [] ((s :-> x) : xs))
-> InputNormalizer -> Decoder (Rec [] ((s :-> x) : xs))
forall (f :: * -> *) a. Applicative f => a -> f a
pure ((Expr Src Void
 -> Validation (ExtractErrors Src Void) (Rec [] ((s :-> x) : xs)))
-> Expector (Expr Src Void) -> Decoder (Rec [] ((s :-> x) : xs))
forall a.
(Expr Src Void -> Extractor Src Void a)
-> Expector (Expr Src Void) -> Decoder a
D.Decoder Expr Src Void
-> Validation (ExtractErrors Src Void) (Rec [] ((s :-> x) : xs))
extract Expector (Expr Src Void)
expected)

-- Op

deriving newtype instance (D.FromDhall b, D.ToDhall x) => D.FromDhall (Op b x)

instance (KnownSymbol s, D.FromDhall (Rec (Op b) xs), D.FromDhall b, D.ToDhall x) => D.FromDhall (Rec (Op b) (s :-> x ': xs)) where
  autoWith :: InputNormalizer -> Decoder (Rec (Op b) ((s :-> x) : xs))
autoWith = do
    let nL :: s :-> x
        nL :: s :-> x
nL = s :-> x
forall a. HasCallStack => a
undefined

    let nameL :: Text
nameL = (s :-> x) -> Text
forall (s :: Symbol) a. KnownSymbol s => (s :-> a) -> Text
valName s :-> x
nL

    D.Decoder Expr Src Void -> Extractor Src Void (Op b x)
extractL Expector (Expr Src Void)
expectedL <- FromDhall (Op b x) => InputNormalizer -> Decoder (Op b x)
forall a. FromDhall a => InputNormalizer -> Decoder a
D.autoWith @(Op b x)

    D.Decoder Expr Src Void -> Extractor Src Void (Rec (Op b) xs)
extractR Expector (Expr Src Void)
expectedR <- FromDhall (Rec (Op b) xs) =>
InputNormalizer -> Decoder (Rec (Op b) xs)
forall a. FromDhall a => InputNormalizer -> Decoder a
D.autoWith @(Rec (Op b) xs)

    let ktsR :: Validation ExpectedTypeErrors (Map Text (RecordField Src Void))
ktsR = Text -> Expr Src Void -> Map Text (RecordField Src Void)
unsafeExpectRecord Text
"Composite Record" (Expr Src Void -> Map Text (RecordField Src Void))
-> Expector (Expr Src Void)
-> Validation ExpectedTypeErrors (Map Text (RecordField Src Void))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Expector (Expr Src Void)
expectedR

    let expected :: Expector (Expr Src Void)
expected = Map Text (RecordField Src Void) -> Expr Src Void
forall s a. Map Text (RecordField s a) -> Expr s a
Record (Map Text (RecordField Src Void) -> Expr Src Void)
-> Validation ExpectedTypeErrors (Map Text (RecordField Src Void))
-> Expector (Expr Src Void)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Text
-> RecordField Src Void
-> Map Text (RecordField Src Void)
-> Map Text (RecordField Src Void)
forall k v. Ord k => k -> v -> Map k v -> Map k v
Dhall.Map.insert Text
nameL (RecordField Src Void
 -> Map Text (RecordField Src Void)
 -> Map Text (RecordField Src Void))
-> (Expr Src Void -> RecordField Src Void)
-> Expr Src Void
-> Map Text (RecordField Src Void)
-> Map Text (RecordField Src Void)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Expr Src Void -> RecordField Src Void
forall s a. Expr s a -> RecordField s a
Dhall.Core.makeRecordField (Expr Src Void
 -> Map Text (RecordField Src Void)
 -> Map Text (RecordField Src Void))
-> Expector (Expr Src Void)
-> Validation
     ExpectedTypeErrors
     (Map Text (RecordField Src Void)
      -> Map Text (RecordField Src Void))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Expector (Expr Src Void)
expectedL Validation
  ExpectedTypeErrors
  (Map Text (RecordField Src Void)
   -> Map Text (RecordField Src Void))
-> Validation ExpectedTypeErrors (Map Text (RecordField Src Void))
-> Validation ExpectedTypeErrors (Map Text (RecordField Src Void))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Validation ExpectedTypeErrors (Map Text (RecordField Src Void))
ktsR)
    let extract :: Expr Src Void
-> Validation
     (ExtractErrors Src Void) (Rec (Op b) ((s :-> x) : xs))
extract Expr Src Void
expression = do
          let die :: Validation (ExtractErrors Src Void) (Rec (Op b) ((s :-> x) : xs))
die = Expector (Expr Src Void)
-> Expr Src Void
-> Validation
     (ExtractErrors Src Void) (Rec (Op b) ((s :-> x) : xs))
forall s a b. Expector (Expr s a) -> Expr s a -> Extractor s a b
D.typeError Expector (Expr Src Void)
expected Expr Src Void
expression

          case Expr Src Void
expression of
            RecordLit Map Text (RecordField Src Void)
kvs ->
              case RecordField Src Void -> Expr Src Void
forall s a. RecordField s a -> Expr s a
Dhall.Core.recordFieldValue (RecordField Src Void -> Expr Src Void)
-> Maybe (RecordField Src Void) -> Maybe (Expr Src Void)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Text
-> Map Text (RecordField Src Void) -> Maybe (RecordField Src Void)
forall k v. Ord k => k -> Map k v -> Maybe v
Dhall.Map.lookup Text
nameL Map Text (RecordField Src Void)
kvs of
                Just Expr Src Void
expressionL ->
                  (Op b (s :-> x) -> Rec (Op b) xs -> Rec (Op b) ((s :-> x) : xs))
-> Validation (ExtractErrors Src Void) (Op b (s :-> x))
-> Extractor Src Void (Rec (Op b) xs)
-> Validation
     (ExtractErrors Src Void) (Rec (Op b) ((s :-> x) : xs))
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2
                    Op b (s :-> x) -> Rec (Op b) xs -> Rec (Op b) ((s :-> x) : xs)
forall u (a :: u -> *) (r :: u) (rs :: [u]).
a r -> Rec a rs -> Rec a (r : rs)
(:&)
                    (((s :-> x) -> x) -> Op b x -> Op b (s :-> x)
forall (f :: * -> *) a b. Contravariant f => (a -> b) -> f b -> f a
contramap (s :-> x) -> x
forall (s :: Symbol) a. (s :-> a) -> a
getVal (Op b x -> Op b (s :-> x))
-> Extractor Src Void (Op b x)
-> Validation (ExtractErrors Src Void) (Op b (s :-> x))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Expr Src Void -> Extractor Src Void (Op b x)
extractL Expr Src Void
expressionL)
                    (Expr Src Void -> Extractor Src Void (Rec (Op b) xs)
extractR Expr Src Void
expression)
                Maybe (Expr Src Void)
_ -> Validation (ExtractErrors Src Void) (Rec (Op b) ((s :-> x) : xs))
die
            Expr Src Void
_ -> Validation (ExtractErrors Src Void) (Rec (Op b) ((s :-> x) : xs))
die
    Decoder (Rec (Op b) ((s :-> x) : xs))
-> InputNormalizer -> Decoder (Rec (Op b) ((s :-> x) : xs))
forall (f :: * -> *) a. Applicative f => a -> f a
pure ((Expr Src Void
 -> Validation
      (ExtractErrors Src Void) (Rec (Op b) ((s :-> x) : xs)))
-> Expector (Expr Src Void)
-> Decoder (Rec (Op b) ((s :-> x) : xs))
forall a.
(Expr Src Void -> Extractor Src Void a)
-> Expector (Expr Src Void) -> Decoder a
D.Decoder Expr Src Void
-> Validation
     (ExtractErrors Src Void) (Rec (Op b) ((s :-> x) : xs))
extract Expector (Expr Src Void)
expected)

-- Predicate
deriving newtype instance (D.ToDhall x) => D.FromDhall (Predicate x)

instance (KnownSymbol s, D.FromDhall (Rec Predicate xs), D.ToDhall x) => D.FromDhall (Rec Predicate (s :-> x ': xs)) where
  autoWith :: InputNormalizer -> Decoder (Rec Predicate ((s :-> x) : xs))
autoWith = do
    let nL :: s :-> x
        nL :: s :-> x
nL = s :-> x
forall a. HasCallStack => a
undefined

    let nameL :: Text
nameL = (s :-> x) -> Text
forall (s :: Symbol) a. KnownSymbol s => (s :-> a) -> Text
valName s :-> x
nL

    D.Decoder Expr Src Void -> Extractor Src Void (Predicate x)
extractL Expector (Expr Src Void)
expectedL <- FromDhall (Predicate x) => InputNormalizer -> Decoder (Predicate x)
forall a. FromDhall a => InputNormalizer -> Decoder a
D.autoWith @(Predicate x)

    D.Decoder Expr Src Void -> Extractor Src Void (Rec Predicate xs)
extractR Expector (Expr Src Void)
expectedR <- FromDhall (Rec Predicate xs) =>
InputNormalizer -> Decoder (Rec Predicate xs)
forall a. FromDhall a => InputNormalizer -> Decoder a
D.autoWith @(Rec Predicate xs)

    let ktsR :: Validation ExpectedTypeErrors (Map Text (RecordField Src Void))
ktsR = Text -> Expr Src Void -> Map Text (RecordField Src Void)
unsafeExpectRecord Text
"Composite Record" (Expr Src Void -> Map Text (RecordField Src Void))
-> Expector (Expr Src Void)
-> Validation ExpectedTypeErrors (Map Text (RecordField Src Void))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Expector (Expr Src Void)
expectedR

    let expected :: Expector (Expr Src Void)
expected = Map Text (RecordField Src Void) -> Expr Src Void
forall s a. Map Text (RecordField s a) -> Expr s a
Record (Map Text (RecordField Src Void) -> Expr Src Void)
-> Validation ExpectedTypeErrors (Map Text (RecordField Src Void))
-> Expector (Expr Src Void)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Text
-> RecordField Src Void
-> Map Text (RecordField Src Void)
-> Map Text (RecordField Src Void)
forall k v. Ord k => k -> v -> Map k v -> Map k v
Dhall.Map.insert Text
nameL (RecordField Src Void
 -> Map Text (RecordField Src Void)
 -> Map Text (RecordField Src Void))
-> (Expr Src Void -> RecordField Src Void)
-> Expr Src Void
-> Map Text (RecordField Src Void)
-> Map Text (RecordField Src Void)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Expr Src Void -> RecordField Src Void
forall s a. Expr s a -> RecordField s a
Dhall.Core.makeRecordField (Expr Src Void
 -> Map Text (RecordField Src Void)
 -> Map Text (RecordField Src Void))
-> Expector (Expr Src Void)
-> Validation
     ExpectedTypeErrors
     (Map Text (RecordField Src Void)
      -> Map Text (RecordField Src Void))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Expector (Expr Src Void)
expectedL Validation
  ExpectedTypeErrors
  (Map Text (RecordField Src Void)
   -> Map Text (RecordField Src Void))
-> Validation ExpectedTypeErrors (Map Text (RecordField Src Void))
-> Validation ExpectedTypeErrors (Map Text (RecordField Src Void))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Validation ExpectedTypeErrors (Map Text (RecordField Src Void))
ktsR)
    let extract :: Expr Src Void
-> Validation
     (ExtractErrors Src Void) (Rec Predicate ((s :-> x) : xs))
extract Expr Src Void
expression = do
          let die :: Validation
  (ExtractErrors Src Void) (Rec Predicate ((s :-> x) : xs))
die = Expector (Expr Src Void)
-> Expr Src Void
-> Validation
     (ExtractErrors Src Void) (Rec Predicate ((s :-> x) : xs))
forall s a b. Expector (Expr s a) -> Expr s a -> Extractor s a b
D.typeError Expector (Expr Src Void)
expected Expr Src Void
expression

          case Expr Src Void
expression of
            RecordLit Map Text (RecordField Src Void)
kvs ->
              case RecordField Src Void -> Expr Src Void
forall s a. RecordField s a -> Expr s a
Dhall.Core.recordFieldValue (RecordField Src Void -> Expr Src Void)
-> Maybe (RecordField Src Void) -> Maybe (Expr Src Void)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Text
-> Map Text (RecordField Src Void) -> Maybe (RecordField Src Void)
forall k v. Ord k => k -> Map k v -> Maybe v
Dhall.Map.lookup Text
nameL Map Text (RecordField Src Void)
kvs of
                Just Expr Src Void
expressionL ->
                  (Predicate (s :-> x)
 -> Rec Predicate xs -> Rec Predicate ((s :-> x) : xs))
-> Validation (ExtractErrors Src Void) (Predicate (s :-> x))
-> Extractor Src Void (Rec Predicate xs)
-> Validation
     (ExtractErrors Src Void) (Rec Predicate ((s :-> x) : xs))
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2
                    Predicate (s :-> x)
-> Rec Predicate xs -> Rec Predicate ((s :-> x) : xs)
forall u (a :: u -> *) (r :: u) (rs :: [u]).
a r -> Rec a rs -> Rec a (r : rs)
(:&)
                    (((s :-> x) -> x) -> Predicate x -> Predicate (s :-> x)
forall (f :: * -> *) a b. Contravariant f => (a -> b) -> f b -> f a
contramap (s :-> x) -> x
forall (s :: Symbol) a. (s :-> a) -> a
getVal (Predicate x -> Predicate (s :-> x))
-> Extractor Src Void (Predicate x)
-> Validation (ExtractErrors Src Void) (Predicate (s :-> x))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Expr Src Void -> Extractor Src Void (Predicate x)
extractL Expr Src Void
expressionL)
                    (Expr Src Void -> Extractor Src Void (Rec Predicate xs)
extractR Expr Src Void
expression)
                Maybe (Expr Src Void)
_ -> Validation
  (ExtractErrors Src Void) (Rec Predicate ((s :-> x) : xs))
die
            Expr Src Void
_ -> Validation
  (ExtractErrors Src Void) (Rec Predicate ((s :-> x) : xs))
die
    Decoder (Rec Predicate ((s :-> x) : xs))
-> InputNormalizer -> Decoder (Rec Predicate ((s :-> x) : xs))
forall (f :: * -> *) a. Applicative f => a -> f a
pure ((Expr Src Void
 -> Validation
      (ExtractErrors Src Void) (Rec Predicate ((s :-> x) : xs)))
-> Expector (Expr Src Void)
-> Decoder (Rec Predicate ((s :-> x) : xs))
forall a.
(Expr Src Void -> Extractor Src Void a)
-> Expector (Expr Src Void) -> Decoder a
D.Decoder Expr Src Void
-> Validation
     (ExtractErrors Src Void) (Rec Predicate ((s :-> x) : xs))
extract Expector (Expr Src Void)
expected)

-- Equivalence

deriving newtype instance (D.ToDhall x) => D.FromDhall (Equivalence x)

instance (KnownSymbol s, D.FromDhall (Rec Equivalence xs), D.ToDhall x) => D.FromDhall (Rec Equivalence (s :-> x ': xs)) where
  autoWith :: InputNormalizer -> Decoder (Rec Equivalence ((s :-> x) : xs))
autoWith = do
    let nL :: s :-> x
        nL :: s :-> x
nL = s :-> x
forall a. HasCallStack => a
undefined

    let nameL :: Text
nameL = (s :-> x) -> Text
forall (s :: Symbol) a. KnownSymbol s => (s :-> a) -> Text
valName s :-> x
nL

    D.Decoder Expr Src Void -> Extractor Src Void (Equivalence x)
extractL Expector (Expr Src Void)
expectedL <- FromDhall (Equivalence x) =>
InputNormalizer -> Decoder (Equivalence x)
forall a. FromDhall a => InputNormalizer -> Decoder a
D.autoWith @(Equivalence x)

    D.Decoder Expr Src Void -> Extractor Src Void (Rec Equivalence xs)
extractR Expector (Expr Src Void)
expectedR <- FromDhall (Rec Equivalence xs) =>
InputNormalizer -> Decoder (Rec Equivalence xs)
forall a. FromDhall a => InputNormalizer -> Decoder a
D.autoWith @(Rec Equivalence xs)

    let ktsR :: Validation ExpectedTypeErrors (Map Text (RecordField Src Void))
ktsR = Text -> Expr Src Void -> Map Text (RecordField Src Void)
unsafeExpectRecord Text
"Composite Record" (Expr Src Void -> Map Text (RecordField Src Void))
-> Expector (Expr Src Void)
-> Validation ExpectedTypeErrors (Map Text (RecordField Src Void))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Expector (Expr Src Void)
expectedR

    let expected :: Expector (Expr Src Void)
expected = Map Text (RecordField Src Void) -> Expr Src Void
forall s a. Map Text (RecordField s a) -> Expr s a
Record (Map Text (RecordField Src Void) -> Expr Src Void)
-> Validation ExpectedTypeErrors (Map Text (RecordField Src Void))
-> Expector (Expr Src Void)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Text
-> RecordField Src Void
-> Map Text (RecordField Src Void)
-> Map Text (RecordField Src Void)
forall k v. Ord k => k -> v -> Map k v -> Map k v
Dhall.Map.insert Text
nameL (RecordField Src Void
 -> Map Text (RecordField Src Void)
 -> Map Text (RecordField Src Void))
-> (Expr Src Void -> RecordField Src Void)
-> Expr Src Void
-> Map Text (RecordField Src Void)
-> Map Text (RecordField Src Void)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Expr Src Void -> RecordField Src Void
forall s a. Expr s a -> RecordField s a
Dhall.Core.makeRecordField (Expr Src Void
 -> Map Text (RecordField Src Void)
 -> Map Text (RecordField Src Void))
-> Expector (Expr Src Void)
-> Validation
     ExpectedTypeErrors
     (Map Text (RecordField Src Void)
      -> Map Text (RecordField Src Void))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Expector (Expr Src Void)
expectedL Validation
  ExpectedTypeErrors
  (Map Text (RecordField Src Void)
   -> Map Text (RecordField Src Void))
-> Validation ExpectedTypeErrors (Map Text (RecordField Src Void))
-> Validation ExpectedTypeErrors (Map Text (RecordField Src Void))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Validation ExpectedTypeErrors (Map Text (RecordField Src Void))
ktsR)
    let extract :: Expr Src Void
-> Validation
     (ExtractErrors Src Void) (Rec Equivalence ((s :-> x) : xs))
extract Expr Src Void
expression = do
          let die :: Validation
  (ExtractErrors Src Void) (Rec Equivalence ((s :-> x) : xs))
die = Expector (Expr Src Void)
-> Expr Src Void
-> Validation
     (ExtractErrors Src Void) (Rec Equivalence ((s :-> x) : xs))
forall s a b. Expector (Expr s a) -> Expr s a -> Extractor s a b
D.typeError Expector (Expr Src Void)
expected Expr Src Void
expression

          case Expr Src Void
expression of
            RecordLit Map Text (RecordField Src Void)
kvs ->
              case RecordField Src Void -> Expr Src Void
forall s a. RecordField s a -> Expr s a
Dhall.Core.recordFieldValue (RecordField Src Void -> Expr Src Void)
-> Maybe (RecordField Src Void) -> Maybe (Expr Src Void)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Text
-> Map Text (RecordField Src Void) -> Maybe (RecordField Src Void)
forall k v. Ord k => k -> Map k v -> Maybe v
Dhall.Map.lookup Text
nameL Map Text (RecordField Src Void)
kvs of
                Just Expr Src Void
expressionL ->
                  (Equivalence (s :-> x)
 -> Rec Equivalence xs -> Rec Equivalence ((s :-> x) : xs))
-> Validation (ExtractErrors Src Void) (Equivalence (s :-> x))
-> Extractor Src Void (Rec Equivalence xs)
-> Validation
     (ExtractErrors Src Void) (Rec Equivalence ((s :-> x) : xs))
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2
                    Equivalence (s :-> x)
-> Rec Equivalence xs -> Rec Equivalence ((s :-> x) : xs)
forall u (a :: u -> *) (r :: u) (rs :: [u]).
a r -> Rec a rs -> Rec a (r : rs)
(:&)
                    (((s :-> x) -> x) -> Equivalence x -> Equivalence (s :-> x)
forall (f :: * -> *) a b. Contravariant f => (a -> b) -> f b -> f a
contramap (s :-> x) -> x
forall (s :: Symbol) a. (s :-> a) -> a
getVal (Equivalence x -> Equivalence (s :-> x))
-> Extractor Src Void (Equivalence x)
-> Validation (ExtractErrors Src Void) (Equivalence (s :-> x))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Expr Src Void -> Extractor Src Void (Equivalence x)
extractL Expr Src Void
expressionL)
                    (Expr Src Void -> Extractor Src Void (Rec Equivalence xs)
extractR Expr Src Void
expression)
                Maybe (Expr Src Void)
_ -> Validation
  (ExtractErrors Src Void) (Rec Equivalence ((s :-> x) : xs))
die
            Expr Src Void
_ -> Validation
  (ExtractErrors Src Void) (Rec Equivalence ((s :-> x) : xs))
die
    Decoder (Rec Equivalence ((s :-> x) : xs))
-> InputNormalizer -> Decoder (Rec Equivalence ((s :-> x) : xs))
forall (f :: * -> *) a. Applicative f => a -> f a
pure ((Expr Src Void
 -> Validation
      (ExtractErrors Src Void) (Rec Equivalence ((s :-> x) : xs)))
-> Expector (Expr Src Void)
-> Decoder (Rec Equivalence ((s :-> x) : xs))
forall a.
(Expr Src Void -> Extractor Src Void a)
-> Expector (Expr Src Void) -> Decoder a
D.Decoder Expr Src Void
-> Validation
     (ExtractErrors Src Void) (Rec Equivalence ((s :-> x) : xs))
extract Expector (Expr Src Void)
expected)

-- | The common case where a function from `a -> Text` can be used
-- in a record.
--
-- @since 0.0.3.0
newtype TextTemplate a = TextTemplate {TextTemplate a -> Op Text a
unTextTemplate :: Op Text a}
  deriving newtype (InputNormalizer -> Decoder (TextTemplate a)
(InputNormalizer -> Decoder (TextTemplate a))
-> FromDhall (TextTemplate a)
forall a. ToDhall a => InputNormalizer -> Decoder (TextTemplate a)
forall a. (InputNormalizer -> Decoder a) -> FromDhall a
autoWith :: InputNormalizer -> Decoder (TextTemplate a)
$cautoWith :: forall a. ToDhall a => InputNormalizer -> Decoder (TextTemplate a)
D.FromDhall)

-- | Run a `TextTemplate` against a value.
--
-- @since 0.0.3.0
runTextTemplate :: TextTemplate a -> a -> Text
runTextTemplate :: TextTemplate a -> a -> Text
runTextTemplate (TextTemplate (Op a -> Text
f)) = a -> Text
f