{-# LANGUAGE TemplateHaskell #-} module Puppet.Parser.Lens ( -- * Prism for 'Statement's _Statements, _ResDecl, _ResDefaultDecl, _ResOverrDecl, _ResCollDecl, _ConditionalDecl, _ClassDecl, _DefineDecl, _NodeDecl, _VarAssignDecl, _MainFuncDecl, _HigherOrderLambdaDecl, _DepDecl, -- * Prism for 'Expression's _Equal, _Different, _Not, _And, _Or, _LessThan, _MoreThan, _LessEqualThan, _MoreEqualThan, _RegexMatch, _NotRegexMatch, _Contains, _Addition, _Substraction, _Division, _Multiplication, _Modulo, _RightShift, _LeftShift, _Lookup, _Negate, _ConditionalValue, _FunctionApplication, _Terminal, ) where import qualified Data.Vector as V import Puppet.Parser.Types import XPrelude makePrisms ''Expression _ResDecl :: Prism' Statement ResDecl _ResDecl = prism ResourceDeclaration $ \x -> case x of ResourceDeclaration a -> Right a _ -> Left x _ResDefaultDecl :: Prism' Statement ResDefaultDecl _ResDefaultDecl = prism ResourceDefaultDeclaration $ \x -> case x of ResourceDefaultDeclaration a -> Right a _ -> Left x _ResOverrDecl :: Prism' Statement ResOverrideDecl _ResOverrDecl = prism ResourceOverrideDeclaration $ \x -> case x of ResourceOverrideDeclaration a -> Right a _ -> Left x _ResCollDecl :: Prism' Statement ResCollDecl _ResCollDecl = prism ResourceCollectionDeclaration $ \x -> case x of ResourceCollectionDeclaration a -> Right a _ -> Left x _ConditionalDecl :: Prism' Statement ConditionalDecl _ConditionalDecl = prism ConditionalDeclaration $ \x -> case x of ConditionalDeclaration a -> Right a _ -> Left x _ClassDecl :: Prism' Statement ClassDecl _ClassDecl = prism ClassDeclaration $ \x -> case x of ClassDeclaration a -> Right a _ -> Left x _DefineDecl :: Prism' Statement DefineDecl _DefineDecl = prism DefineDeclaration $ \x -> case x of DefineDeclaration a -> Right a _ -> Left x _NodeDecl :: Prism' Statement NodeDecl _NodeDecl = prism NodeDeclaration $ \x -> case x of NodeDeclaration a -> Right a _ -> Left x _VarAssignDecl :: Prism' Statement VarAssignDecl _VarAssignDecl = prism VarAssignmentDeclaration $ \x -> case x of VarAssignmentDeclaration a -> Right a _ -> Left x _MainFuncDecl :: Prism' Statement MainFuncDecl _MainFuncDecl = prism MainFunctionDeclaration $ \x -> case x of MainFunctionDeclaration a -> Right a _ -> Left x _HigherOrderLambdaDecl :: Prism' Statement HigherOrderLambdaDecl _HigherOrderLambdaDecl = prism HigherOrderLambdaDeclaration $ \x -> case x of HigherOrderLambdaDeclaration a -> Right a _ -> Left x _DepDecl :: Prism' Statement DepDecl _DepDecl = prism DependencyDeclaration $ \x -> case x of DependencyDeclaration a -> Right a _ -> Left x _TopContainer :: Prism' Statement (V.Vector Statement, Statement) _TopContainer = prism (uncurry TopContainer) $ \x -> case x of TopContainer vs s -> Right (vs, s) _ -> Left x _Statements :: Lens' Statement [Statement] _Statements = lens (V.toList . sget) (\s v -> sset s (V.fromList v)) where sget :: Statement -> V.Vector Statement sget (ClassDeclaration (ClassDecl _ _ _ s _)) = s sget (DefineDeclaration (DefineDecl _ _ s _)) = s sget (NodeDeclaration (NodeDecl _ s _ _)) = s sget (TopContainer s _) = s sget (HigherOrderLambdaDeclaration (HigherOrderLambdaDecl (HOLambdaCall _ _ _ s _) _)) = s sget _ = V.empty sset :: Statement -> V.Vector Statement -> Statement sset (ClassDeclaration (ClassDecl n args inh _ p)) s = ClassDeclaration (ClassDecl n args inh s p) sset (NodeDeclaration (NodeDecl ns _ nd' p)) s = NodeDeclaration (NodeDecl ns s nd' p) sset (DefineDeclaration (DefineDecl n args _ p)) s = DefineDeclaration (DefineDecl n args s p) sset (TopContainer _ p) s = TopContainer s p sset (HigherOrderLambdaDeclaration (HigherOrderLambdaDecl (HOLambdaCall t e pr _ e2) p)) s = HigherOrderLambdaDeclaration (HigherOrderLambdaDecl (HOLambdaCall t e pr s e2) p) sset x _ = x