{-# OPTIONS_GHC -Wno-orphans #-}

module Dhall.Syntax.Instances.Bifunctor () where

import Data.Bifunctor                 (Bifunctor (..))
import Dhall.Syntax.Binding
import Dhall.Syntax.Expr
import Dhall.Syntax.FunctionBinding
import Dhall.Syntax.Instances.Functor ()
import Dhall.Syntax.Operations
import Dhall.Syntax.RecordField

import qualified Lens.Family as Lens

instance Bifunctor Binding where
    first :: forall a b c. (a -> b) -> Binding a c -> Binding b c
first a -> b
k (Binding Maybe a
src0 Text
a Maybe a
src1 Maybe (Maybe a, Expr a c)
b Maybe a
src2 Expr a c
c) =
        Maybe b
-> Text
-> Maybe b
-> Maybe (Maybe b, Expr b c)
-> Maybe b
-> Expr b c
-> Binding b c
forall s a.
Maybe s
-> Text
-> Maybe s
-> Maybe (Maybe s, Expr s a)
-> Maybe s
-> Expr s a
-> Binding s a
Binding ((a -> b) -> Maybe a -> Maybe b
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
k Maybe a
src0) Text
a ((a -> b) -> Maybe a -> Maybe b
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
k Maybe a
src1) (((Maybe a, Expr a c) -> (Maybe b, Expr b c))
-> Maybe (Maybe a, Expr a c) -> Maybe (Maybe b, Expr b c)
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Maybe a, Expr a c) -> (Maybe b, Expr b c)
forall {f :: * -> *} {p :: * -> * -> *} {c}.
(Functor f, Bifunctor p) =>
(f a, p a c) -> (f b, p b c)
adapt0 Maybe (Maybe a, Expr a c)
b) ((a -> b) -> Maybe a -> Maybe b
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
k Maybe a
src2) ((a -> b) -> Expr a c -> Expr b c
forall a b c. (a -> b) -> Expr a c -> Expr b c
forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first a -> b
k Expr a c
c)
      where
        adapt0 :: (f a, p a c) -> (f b, p b c)
adapt0 (f a
src3, p a c
d) = ((a -> b) -> f a -> f b
forall a b. (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
k f a
src3, (a -> b) -> p a c -> p b c
forall a b c. (a -> b) -> p a c -> p b c
forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first a -> b
k p a c
d)

    second :: forall b c a. (b -> c) -> Binding a b -> Binding a c
second = (b -> c) -> Binding a b -> Binding a c
forall a b. (a -> b) -> Binding a a -> Binding a b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap

instance Bifunctor RecordField where
    first :: forall a b c. (a -> b) -> RecordField a c -> RecordField b c
first a -> b
k (RecordField Maybe a
s0 Expr a c
value' Maybe a
s1 Maybe a
s2) =
        Maybe b -> Expr b c -> Maybe b -> Maybe b -> RecordField b c
forall s a.
Maybe s -> Expr s a -> Maybe s -> Maybe s -> RecordField s a
RecordField (a -> b
k (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe a
s0) ((a -> b) -> Expr a c -> Expr b c
forall a b c. (a -> b) -> Expr a c -> Expr b c
forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first a -> b
k Expr a c
value') (a -> b
k (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe a
s1) (a -> b
k (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe a
s2)
    second :: forall b c a. (b -> c) -> RecordField a b -> RecordField a c
second = (b -> c) -> RecordField a b -> RecordField a c
forall a b. (a -> b) -> RecordField a a -> RecordField a b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap

instance Bifunctor FunctionBinding where
    first :: forall a b c.
(a -> b) -> FunctionBinding a c -> FunctionBinding b c
first a -> b
k (FunctionBinding Maybe a
src0 Text
label Maybe a
src1 Maybe a
src2 Expr a c
type_) =
        Maybe b
-> Text -> Maybe b -> Maybe b -> Expr b c -> FunctionBinding b c
forall s a.
Maybe s
-> Text -> Maybe s -> Maybe s -> Expr s a -> FunctionBinding s a
FunctionBinding (a -> b
k (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe a
src0) Text
label (a -> b
k (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe a
src1) (a -> b
k (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe a
src2) ((a -> b) -> Expr a c -> Expr b c
forall a b c. (a -> b) -> Expr a c -> Expr b c
forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first a -> b
k Expr a c
type_)

    second :: forall b c a.
(b -> c) -> FunctionBinding a b -> FunctionBinding a c
second = (b -> c) -> FunctionBinding a b -> FunctionBinding a c
forall a b. (a -> b) -> FunctionBinding a a -> FunctionBinding a b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap

instance Bifunctor Expr where
    first :: forall a b c. (a -> b) -> Expr a c -> Expr b c
first a -> b
k (Note a
a Expr a c
b   ) = b -> Expr b c -> Expr b c
forall s a. s -> Expr s a -> Expr s a
Note (a -> b
k a
a) ((a -> b) -> Expr a c -> Expr b c
forall a b c. (a -> b) -> Expr a c -> Expr b c
forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first a -> b
k Expr a c
b)
    first a -> b
_ (Embed c
a    ) = c -> Expr b c
forall s a. a -> Expr s a
Embed c
a
    first a -> b
k (Let Binding a c
a Expr a c
b    ) = Binding b c -> Expr b c -> Expr b c
forall s a. Binding s a -> Expr s a -> Expr s a
Let ((a -> b) -> Binding a c -> Binding b c
forall a b c. (a -> b) -> Binding a c -> Binding b c
forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first a -> b
k Binding a c
a) ((a -> b) -> Expr a c -> Expr b c
forall a b c. (a -> b) -> Expr a c -> Expr b c
forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first a -> b
k Expr a c
b)
    first a -> b
k (Record Map Text (RecordField a c)
a   ) = Map Text (RecordField b c) -> Expr b c
forall s a. Map Text (RecordField s a) -> Expr s a
Record (Map Text (RecordField b c) -> Expr b c)
-> Map Text (RecordField b c) -> Expr b c
forall a b. (a -> b) -> a -> b
$ (a -> b) -> RecordField a c -> RecordField b c
forall a b c. (a -> b) -> RecordField a c -> RecordField b c
forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first a -> b
k (RecordField a c -> RecordField b c)
-> Map Text (RecordField a c) -> Map Text (RecordField b c)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Map Text (RecordField a c)
a
    first a -> b
k (RecordLit Map Text (RecordField a c)
a) = Map Text (RecordField b c) -> Expr b c
forall s a. Map Text (RecordField s a) -> Expr s a
RecordLit (Map Text (RecordField b c) -> Expr b c)
-> Map Text (RecordField b c) -> Expr b c
forall a b. (a -> b) -> a -> b
$ (a -> b) -> RecordField a c -> RecordField b c
forall a b c. (a -> b) -> RecordField a c -> RecordField b c
forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first a -> b
k (RecordField a c -> RecordField b c)
-> Map Text (RecordField a c) -> Map Text (RecordField b c)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Map Text (RecordField a c)
a
    first a -> b
k (Lam Maybe CharacterSet
cs FunctionBinding a c
a Expr a c
b ) = Maybe CharacterSet -> FunctionBinding b c -> Expr b c -> Expr b c
forall s a.
Maybe CharacterSet -> FunctionBinding s a -> Expr s a -> Expr s a
Lam Maybe CharacterSet
cs ((a -> b) -> FunctionBinding a c -> FunctionBinding b c
forall a b c.
(a -> b) -> FunctionBinding a c -> FunctionBinding b c
forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first a -> b
k FunctionBinding a c
a) ((a -> b) -> Expr a c -> Expr b c
forall a b c. (a -> b) -> Expr a c -> Expr b c
forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first a -> b
k Expr a c
b)
    first a -> b
k (Field Expr a c
a FieldSelection a
b  ) = Expr b c -> FieldSelection b -> Expr b c
forall s a. Expr s a -> FieldSelection s -> Expr s a
Field ((a -> b) -> Expr a c -> Expr b c
forall a b c. (a -> b) -> Expr a c -> Expr b c
forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first a -> b
k Expr a c
a) (a -> b
k (a -> b) -> FieldSelection a -> FieldSelection b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> FieldSelection a
b)
    first a -> b
k  Expr a c
expression  = ASetter (Expr a c) (Expr b c) (Expr a c) (Expr b c)
-> (Expr a c -> Expr b c) -> Expr a c -> Expr b c
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
Lens.over ASetter (Expr a c) (Expr b c) (Expr a c) (Expr b c)
forall (f :: * -> *) s a t b.
Applicative f =>
(Expr s a -> f (Expr t b)) -> Expr s a -> f (Expr t b)
unsafeSubExpressions ((a -> b) -> Expr a c -> Expr b c
forall a b c. (a -> b) -> Expr a c -> Expr b c
forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first a -> b
k) Expr a c
expression

    second :: forall b c a. (b -> c) -> Expr a b -> Expr a c
second = (b -> c) -> Expr a b -> Expr a c
forall a b. (a -> b) -> Expr a a -> Expr a b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap