nix-lang-0.1.0.0: src/Nix/Lang/Types/Syn.hs
{-# LANGUAGE DeriveDataTypeable #-}
-- | Fresh syntax-tree specialization with smart constructors.
--
-- This is the AST you reach for when you are building Nix code yourself rather
-- than recovering it from an existing file.
--
-- It gives you the concrete type aliases for the annotation-free pass together
-- with smart constructors such as 'mkVar', 'mkApp', and 'mkSet'. These trees are
-- the natural input to 'Nix.Lang.RFCPrint'.
--
-- Example construction:
--
-- @
-- import Nix.Lang.Types.Syn (Expr, mkLet, mkNormalBinding, mkVar)
--
-- expr :: Expr
-- expr = mkLet [mkNormalBinding (mkVar "x") (mkVar "y")] (mkVar "x")
-- @
module Nix.Lang.Types.Syn
( Syn,
Expr,
Binding,
AttrPath,
AttrKey,
FuncPat,
Lit,
StringPart,
NString,
Path,
SetPatAs,
SetPatBinding,
mkVar,
mkLit,
mkPar,
mkString,
mkPath,
mkEnvPath,
mkLam,
mkApp,
mkBinApp,
mkNot,
mkNeg,
mkList,
mkSet,
mkRecSet,
mkLet,
mkHasAttr,
mkSelect,
mkSelectOr,
mkIf,
mkWith,
mkAssert,
mkUriLit,
mkIntegerLit,
mkFloatLit,
mkBooleanLit,
mkNullLit,
mkUri,
mkInt,
mkFloat,
mkBool,
mkTrue,
mkFalse,
mkNull,
mkStringLiteral,
mkInterpol,
mkDoubleQuotedString,
mkIndentedNString,
mkText,
mkIndentedText,
mkLiteralPath,
mkInterpolatedPath,
mkAttr,
mkQuotedAttr,
mkDynamicAttr,
mkInterpolatedAttr,
mkAttrs,
mkAttrPath,
mkNormalBinding,
mkBinding,
mkBindingPath,
mkInheritKeys,
mkInherit,
mkInheritFromKeys,
mkInheritFrom,
mkOptionalBinding,
mkOptionalBindingPath,
mkStaticSet,
mkStaticRecSet,
mkStaticLet,
mkSelectAttrs,
mkSelectOrAttrs,
mkHasAttrs,
mkVarPat,
mkSetPat,
mkSetPatBinding,
mkSetPatAs,
)
where
import Data.Data (Data)
import Data.Text (Text)
import Nix.Lang.Types
-- | Syntax (or synthetic) pass
data Syn deriving (Data)
type instance XRec Syn a = a
instance UnXRec Syn where
unXRec _ = id
type instance NixVarName Syn = Text
type instance NixBinderName Syn = Text
type instance NixAttrName Syn = Text
type instance XNixUri Syn = NoExtF
type instance XNixInteger Syn = NoExtF
type instance XNixFloat Syn = NoExtF
type instance XNixBoolean Syn = NoExtF
type instance XNixNull Syn = NoExtF
type instance XXNixLit Syn = NoExtC
type instance XNixStringLiteral Syn = NoExtF
type instance XNixStringInterpol Syn = NoExtF
type instance XXNixStringPart Syn = NoExtC
type instance XNixDoubleQuotesString Syn = NoExtF
type instance XNixDoubleSingleQuotesString Syn = NoExtF
type instance XXNixString Syn = NoExtC
type instance XNixLiteralPath Syn = NoExtF
type instance XNixInterpolPath Syn = NoExtF
type instance XXNixPath Syn = NoExtC
type instance XNixStaticAttrKey Syn = NoExtF
type instance XNixDynamicStringAttrKey Syn = NoExtF
type instance XNixDynamicInterpolAttrKey Syn = NoExtF
type instance XXNixAttrKey Syn = NoExtC
type instance XNixAttrPath Syn = NoExtF
type instance XNixNormalBinding Syn = NoExtF
type instance XNixInheritBinding Syn = NoExtF
type instance XXNixBinding Syn = NoExtC
type instance XNixVarPat Syn = NoExtF
type instance XNixSetPat Syn = NoExtF
type instance XNixSetPatAs Syn = NoExtF
type instance XNixSetPatBinding Syn = NoExtF
type instance XXNixFuncPat Syn = NoExtC
type instance XNixVar Syn = NoExtF
type instance XNixLit Syn = NoExtF
type instance XNixPar Syn = NoExtF
type instance XNixString Syn = NoExtF
type instance XNixPath Syn = NoExtF
type instance XNixEnvPath Syn = NoExtF
type instance XNixLam Syn = NoExtF
type instance XNixApp Syn = NoExtF
type instance XNixBinApp Syn = NoExtF
type instance XNixNotApp Syn = NoExtF
type instance XNixNegApp Syn = NoExtF
type instance XNixList Syn = NoExtF
type instance XNixSet Syn = NoExtF
type instance XNixLet Syn = NoExtF
type instance XNixHasAttr Syn = NoExtF
type instance XNixSelect Syn = NoExtF
type instance XNixIf Syn = NoExtF
type instance XNixWith Syn = NoExtF
type instance XNixAssert Syn = NoExtF
type instance XXNixExpr Syn = NoExtC
type Expr = NixExpr Syn
type Binding = NixBinding Syn
type AttrPath = NixAttrPath Syn
type AttrKey = NixAttrKey Syn
type FuncPat = NixFuncPat Syn
type Lit = NixLit Syn
type StringPart = NixStringPart Syn
type NString = NixString Syn
type Path = NixPath Syn
type SetPatAs = NixSetPatAs Syn
type SetPatBinding = NixSetPatBinding Syn
mkVar :: Text -> Expr
mkVar = NixVar NoExtF
mkLit :: Lit -> Expr
mkLit = NixLit NoExtF
mkPar :: Expr -> Expr
mkPar = NixPar NoExtF
mkString :: NString -> Expr
mkString = NixString NoExtF
mkPath :: Path -> Expr
mkPath = NixPath NoExtF
mkEnvPath :: Text -> Expr
mkEnvPath = NixEnvPath NoExtF
mkLam :: FuncPat -> Expr -> Expr
mkLam = NixLam NoExtF
mkApp :: Expr -> Expr -> Expr
mkApp = NixApp NoExtF
mkBinApp :: BinaryOp -> Expr -> Expr -> Expr
mkBinApp = NixBinApp NoExtF
mkNot :: Expr -> Expr
mkNot = NixNotApp NoExtF
mkNeg :: Expr -> Expr
mkNeg = NixNegApp NoExtF
mkList :: [Expr] -> Expr
mkList = NixList NoExtF
mkSet :: [Binding] -> Expr
mkSet = NixSet NoExtF NixSetNonRecursive
mkRecSet :: [Binding] -> Expr
mkRecSet = NixSet NoExtF NixSetRecursive
mkLet :: [Binding] -> Expr -> Expr
mkLet = NixLet NoExtF
mkHasAttr :: Expr -> AttrPath -> Expr
mkHasAttr = NixHasAttr NoExtF
mkSelect :: Expr -> AttrPath -> Expr
mkSelect expr path' = NixSelect NoExtF expr path' Nothing
mkSelectOr :: Expr -> AttrPath -> Expr -> Expr
mkSelectOr expr path' fallback = NixSelect NoExtF expr path' (Just fallback)
mkIf :: Expr -> Expr -> Expr -> Expr
mkIf = NixIf NoExtF
mkWith :: Expr -> Expr -> Expr
mkWith = NixWith NoExtF
mkAssert :: Expr -> Expr -> Expr
mkAssert = NixAssert NoExtF
mkUriLit :: Text -> Lit
mkUriLit = NixUri NoExtF
mkIntegerLit :: Integer -> Lit
mkIntegerLit = NixInteger NoExtF
mkFloatLit :: Float -> Lit
mkFloatLit = NixFloat NoExtF
mkBooleanLit :: Bool -> Lit
mkBooleanLit = NixBoolean NoExtF
mkNullLit :: Lit
mkNullLit = NixNull NoExtF
mkUri :: Text -> Expr
mkUri = mkLit . mkUriLit
mkInt :: Integer -> Expr
mkInt = mkLit . mkIntegerLit
mkFloat :: Float -> Expr
mkFloat = mkLit . mkFloatLit
mkBool :: Bool -> Expr
mkBool = mkLit . mkBooleanLit
mkTrue :: Expr
mkTrue = mkBool True
mkFalse :: Expr
mkFalse = mkBool False
mkNull :: Expr
mkNull = mkLit mkNullLit
mkStringLiteral :: Text -> StringPart
mkStringLiteral = NixStringLiteral NoExtF
mkInterpol :: Expr -> StringPart
mkInterpol = NixStringInterpol NoExtF
mkDoubleQuotedString :: [StringPart] -> NString
mkDoubleQuotedString = NixDoubleQuotesString NoExtF
mkIndentedNString :: [StringPart] -> NString
mkIndentedNString = NixDoubleSingleQuotesString NoExtF
mkText :: Text -> Expr
mkText value = mkString (mkDoubleQuotedString [mkStringLiteral value])
mkIndentedText :: Text -> Expr
mkIndentedText value = mkString (mkIndentedNString [mkStringLiteral value])
mkLiteralPath :: Text -> Path
mkLiteralPath = NixLiteralPath NoExtF
mkInterpolatedPath :: [StringPart] -> Path
mkInterpolatedPath = NixInterpolPath NoExtF
mkAttr :: Text -> AttrKey
mkAttr = NixStaticAttrKey NoExtF
mkQuotedAttr :: Text -> AttrKey
mkQuotedAttr value = mkDynamicAttr [mkStringLiteral value]
mkDynamicAttr :: [StringPart] -> AttrKey
mkDynamicAttr = NixDynamicStringAttrKey NoExtF
mkInterpolatedAttr :: Expr -> AttrKey
mkInterpolatedAttr = NixDynamicInterpolAttrKey NoExtF
mkAttrs :: [Text] -> AttrPath
mkAttrs = mkAttrPath . fmap mkAttr
mkAttrPath :: [AttrKey] -> AttrPath
mkAttrPath = NixAttrPath NoExtF
mkNormalBinding :: AttrPath -> Expr -> Binding
mkNormalBinding = NixNormalBinding NoExtF
mkBinding :: [Text] -> Expr -> Binding
mkBinding pathParts value = mkBindingPath (fmap mkAttr pathParts) value
mkBindingPath :: [AttrKey] -> Expr -> Binding
mkBindingPath keys value = mkNormalBinding (mkAttrPath keys) value
mkInheritKeys :: [AttrKey] -> Binding
mkInheritKeys = mkInheritBinding Nothing
mkInherit :: [Text] -> Binding
mkInherit = mkInheritKeys . fmap mkAttr
mkInheritFromKeys :: Expr -> [AttrKey] -> Binding
mkInheritFromKeys scope = mkInheritBinding (Just scope)
mkInheritFrom :: Expr -> [Text] -> Binding
mkInheritFrom scope = mkInheritFromKeys scope . fmap mkAttr
mkOptionalBinding :: [Text] -> Maybe Expr -> [Binding]
mkOptionalBinding pathParts = maybe [] (pure . mkBinding pathParts)
mkOptionalBindingPath :: [AttrKey] -> Maybe Expr -> [Binding]
mkOptionalBindingPath keys = maybe [] (pure . mkBindingPath keys)
mkStaticSet :: [(Text, Expr)] -> Expr
mkStaticSet = mkSet . fmap (uncurry (mkBinding . pure))
mkStaticRecSet :: [(Text, Expr)] -> Expr
mkStaticRecSet = mkRecSet . fmap (uncurry (mkBinding . pure))
mkStaticLet :: [(Text, Expr)] -> Expr -> Expr
mkStaticLet bindings body = mkLet (fmap (uncurry (mkBinding . pure)) bindings) body
mkSelectAttrs :: Expr -> [Text] -> Expr
mkSelectAttrs expr = mkSelect expr . mkAttrs
mkSelectOrAttrs :: Expr -> [Text] -> Expr -> Expr
mkSelectOrAttrs expr pathParts fallback = mkSelectOr expr (mkAttrs pathParts) fallback
mkHasAttrs :: Expr -> [Text] -> Expr
mkHasAttrs expr = mkHasAttr expr . mkAttrs
mkVarPat :: Text -> FuncPat
mkVarPat = NixVarPat NoExtF
mkSetPat :: NixSetPatEllipses -> Maybe (NixSetPatAs Syn) -> [NixSetPatBinding Syn] -> FuncPat
mkSetPat = NixSetPat NoExtF
mkSetPatBinding :: Text -> Maybe Expr -> NixSetPatBinding Syn
mkSetPatBinding = NixSetPatBinding NoExtF
mkSetPatAs :: NixSetPatAsLocation -> Text -> NixSetPatAs Syn
mkSetPatAs location name = NixSetPatAs NoExtF location name
mkInheritBinding :: Maybe Expr -> [AttrKey] -> Binding
mkInheritBinding = NixInheritBinding NoExtF