module Language.Cimple
    ( module X
    , DefaultActions
    , defaultActions
    , removeSloc
    , elideGroups
    , getParamNameFromNode
    ) where

import           Control.Monad.State.Strict          (State)
import qualified Control.Monad.State.Strict          as State
import           Data.Fix                            (Fix (..))
import           Data.Text                           (Text)

import           Language.Cimple.Annot               as X
import           Language.Cimple.Ast                 as X
import           Language.Cimple.DescribeAst         as X
import           Language.Cimple.Flatten             as X
import           Language.Cimple.Lexer               as X
import           Language.Cimple.MapAst              as X
import           Language.Cimple.Parser              as X
import           Language.Cimple.Parser.Error.Pretty as X
import           Language.Cimple.Tokens              as X

type DefaultActions a = X.IdentityActions (State a) Text

defaultActions :: DefaultActions state
defaultActions :: DefaultActions state
defaultActions = DefaultActions state
forall (f :: * -> *) text. Applicative f => AstActions f text text
X.identityActions

removeSloc :: Node (Lexeme Text) -> Node (Lexeme Text)
removeSloc :: Node (Lexeme Text) -> Node (Lexeme Text)
removeSloc =
    (State () (Node (Lexeme Text)) -> () -> Node (Lexeme Text))
-> () -> State () (Node (Lexeme Text)) -> Node (Lexeme Text)
forall a b c. (a -> b -> c) -> b -> a -> c
flip State () (Node (Lexeme Text)) -> () -> Node (Lexeme Text)
forall s a. State s a -> s -> a
State.evalState () (State () (Node (Lexeme Text)) -> Node (Lexeme Text))
-> (Node (Lexeme Text) -> State () (Node (Lexeme Text)))
-> Node (Lexeme Text)
-> Node (Lexeme Text)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AstActions (State ()) Text Text
-> Node (Lexeme Text)
-> State () (Mapped Text Text (Node (Lexeme Text)))
forall itext otext a (f :: * -> *).
(MapAst itext otext a, Applicative f, HasCallStack) =>
AstActions f itext otext -> a -> f (Mapped itext otext a)
mapAst AstActions (State ()) Text Text
forall state. DefaultActions state
defaultActions
        { doLexeme :: FilePath
-> Lexeme Text -> State () (Lexeme Text) -> State () (Lexeme Text)
doLexeme = \FilePath
_ (L AlexPosn
_ LexemeClass
c Text
t) State () (Lexeme Text)
_ -> Lexeme Text -> State () (Lexeme Text)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Lexeme Text -> State () (Lexeme Text))
-> Lexeme Text -> State () (Lexeme Text)
forall a b. (a -> b) -> a -> b
$ AlexPosn -> LexemeClass -> Text -> Lexeme Text
forall text. AlexPosn -> LexemeClass -> text -> Lexeme text
L (Int -> Int -> Int -> AlexPosn
AlexPn Int
0 Int
0 Int
0) LexemeClass
c Text
t }

elideGroups :: Node (Lexeme Text) -> Node (Lexeme Text)
elideGroups :: Node (Lexeme Text) -> Node (Lexeme Text)
elideGroups =
    (State () (Node (Lexeme Text)) -> () -> Node (Lexeme Text))
-> () -> State () (Node (Lexeme Text)) -> Node (Lexeme Text)
forall a b c. (a -> b -> c) -> b -> a -> c
flip State () (Node (Lexeme Text)) -> () -> Node (Lexeme Text)
forall s a. State s a -> s -> a
State.evalState () (State () (Node (Lexeme Text)) -> Node (Lexeme Text))
-> (Node (Lexeme Text) -> State () (Node (Lexeme Text)))
-> Node (Lexeme Text)
-> Node (Lexeme Text)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AstActions (State ()) Text Text
-> Node (Lexeme Text)
-> State () (Mapped Text Text (Node (Lexeme Text)))
forall itext otext a (f :: * -> *).
(MapAst itext otext a, Applicative f, HasCallStack) =>
AstActions f itext otext -> a -> f (Mapped itext otext a)
mapAst AstActions (State ()) Text Text
forall state. DefaultActions state
defaultActions
        { doNodes :: FilePath
-> [Node (Lexeme Text)]
-> State () [Node (Lexeme Text)]
-> State () [Node (Lexeme Text)]
doNodes = \FilePath
_ [Node (Lexeme Text)]
_ State () [Node (Lexeme Text)]
m_nodes -> do
            [Node (Lexeme Text)]
nodes <- State () [Node (Lexeme Text)]
m_nodes
            [Node (Lexeme Text)] -> State () [Node (Lexeme Text)]
forall (m :: * -> *) a. Monad m => a -> m a
return ([Node (Lexeme Text)] -> State () [Node (Lexeme Text)])
-> [Node (Lexeme Text)] -> State () [Node (Lexeme Text)]
forall a b. (a -> b) -> a -> b
$ (Node (Lexeme Text) -> [Node (Lexeme Text)])
-> [Node (Lexeme Text)] -> [Node (Lexeme Text)]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap Node (Lexeme Text) -> [Node (Lexeme Text)]
forall lexeme. Fix (NodeF lexeme) -> [Fix (NodeF lexeme)]
flatten [Node (Lexeme Text)]
nodes
        }
  where
    flatten :: Fix (NodeF lexeme) -> [Fix (NodeF lexeme)]
flatten (Fix (Group [Fix (NodeF lexeme)]
ns)) = (Fix (NodeF lexeme) -> [Fix (NodeF lexeme)])
-> [Fix (NodeF lexeme)] -> [Fix (NodeF lexeme)]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap Fix (NodeF lexeme) -> [Fix (NodeF lexeme)]
flatten [Fix (NodeF lexeme)]
ns
    flatten Fix (NodeF lexeme)
n                = [Fix (NodeF lexeme)
n]

getParamNameFromNode :: Node (Lexeme Text) -> Maybe Text
getParamNameFromNode :: Node (Lexeme Text) -> Maybe Text
getParamNameFromNode (Fix (VarDecl Node (Lexeme Text)
_ (L AlexPosn
_ LexemeClass
_ Text
name) [Node (Lexeme Text)]
_)) = Text -> Maybe Text
forall a. a -> Maybe a
Just Text
name
getParamNameFromNode Node (Lexeme Text)
_                                = Maybe Text
forall a. Maybe a
Nothing