{-# LANGUAGE DeriveGeneric #-} module Dhall.Syntax.FunctionBinding ( FunctionBinding(..) , makeFunctionBinding -- * Optics , functionBindingExprs ) where import Data.Text (Text) import {-# SOURCE #-} Dhall.Syntax.Expr (Expr) import GHC.Generics (Generic) -- | Record the label of a function or a function-type expression -- -- For example, -- -- > λ({- A -} a {- B -} : {- C -} T) -> e -- -- … will be instantiated as follows: -- -- * @functionBindingSrc0@ corresponds to the @A@ comment -- * @functionBindingVariable@ is @a@ -- * @functionBindingSrc1@ corresponds to the @B@ comment -- * @functionBindingSrc2@ corresponds to the @C@ comment -- * @functionBindingAnnotation@ is @T@ data FunctionBinding s a = FunctionBinding { functionBindingSrc0 :: Maybe s , functionBindingVariable :: Text , functionBindingSrc1 :: Maybe s , functionBindingSrc2 :: Maybe s , functionBindingAnnotation :: Expr s a } deriving Generic -- | Smart constructor for 'FunctionBinding' with no src information makeFunctionBinding :: Text -> Expr s a -> FunctionBinding s a makeFunctionBinding l t = FunctionBinding Nothing l Nothing Nothing t {-| Traverse over the immediate 'Expr' children in a 'FunctionBinding'. -} functionBindingExprs :: Applicative f => (Expr s a -> f (Expr s b)) -> FunctionBinding s a -> f (FunctionBinding s b) functionBindingExprs f (FunctionBinding s0 label s1 s2 type_) = FunctionBinding <$> pure s0 <*> pure label <*> pure s1 <*> pure s2 <*> f type_ {-# INLINABLE functionBindingExprs #-}