content: {-# 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.Micro as Lens
  
  instance Bifunctor Binding where
      first k (Binding src0 a src1 b src2 c) =
          Binding (fmap k src0) a (fmap k src1) (fmap adapt0 b) (fmap k src2) (first k c)
        where
          adapt0 (src3, d) = (fmap k src3, first k d)
  
      second = fmap
  
  instance Bifunctor RecordField where
      first k (RecordField s0 value' s1 s2) =
          RecordField (k <$> s0) (first k value') (k <$> s1) (k <$> s2)
      second = fmap
  
  instance Bifunctor FunctionBinding where
      first k (FunctionBinding src0 label src1 src2 type_) =
          FunctionBinding (k <$> src0) label (k <$> src1) (k <$> src2) (first k type_)
  
      second = fmap
  
  instance Bifunctor Expr where
      first k (Note a b   ) = Note (k a) (first k b)
      first _ (Embed a    ) = Embed a
      first k (Let a b    ) = Let (first k a) (first k b)
      first k (Record a   ) = Record $ first k <$> a
      first k (RecordLit a) = RecordLit $ first k <$> a
      first k (Lam cs a b ) = Lam cs (first k a) (first k b)
      first k (Field a b  ) = Field (first k a) (k <$> b)
      first k  expression  = Lens.over unsafeSubExpressions (first k) expression
  
      second = fmap
  