module UntypedPlutusCore.AstSize
  ( AstSize (..)
  , termAstSize
  , programAstSize
  ) where

import PlutusCore.AstSize (AstSize (..))
import UntypedPlutusCore.Core

import Control.Lens
import Data.Foldable

-- | Count the number of AST nodes in a term.
termAstSize :: Term name uni fun ann -> AstSize
termAstSize :: forall name (uni :: * -> *) fun ann.
Term name uni fun ann -> AstSize
termAstSize Term name uni fun ann
term =
  [AstSize] -> AstSize
forall m. Monoid m => [m] -> m
forall (t :: * -> *) m. (Foldable t, Monoid m) => t m -> m
fold
    [ Integer -> AstSize
AstSize Integer
1
    , Term name uni fun ann
term Term name uni fun ann
-> Getting AstSize (Term name uni fun ann) AstSize -> AstSize
forall s a. s -> Getting a s a -> a
^. (Term name uni fun ann -> Const AstSize (Term name uni fun ann))
-> Term name uni fun ann -> Const AstSize (Term name uni fun ann)
forall name (uni :: * -> *) fun ann (f :: * -> *).
Applicative f =>
(Term name uni fun ann -> f (Term name uni fun ann))
-> Term name uni fun ann -> f (Term name uni fun ann)
termSubterms ((Term name uni fun ann -> Const AstSize (Term name uni fun ann))
 -> Term name uni fun ann -> Const AstSize (Term name uni fun ann))
-> Getting AstSize (Term name uni fun ann) AstSize
-> Getting AstSize (Term name uni fun ann) AstSize
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Term name uni fun ann -> AstSize)
-> Getting AstSize (Term name uni fun ann) AstSize
forall (p :: * -> * -> *) (f :: * -> *) s a.
(Profunctor p, Contravariant f) =>
(s -> a) -> Optic' p f s a
to Term name uni fun ann -> AstSize
forall name (uni :: * -> *) fun ann.
Term name uni fun ann -> AstSize
termAstSize
    ]

-- | Count the number of AST nodes in a program.
programAstSize :: Program name uni fun ann -> AstSize
programAstSize :: forall name (uni :: * -> *) fun ann.
Program name uni fun ann -> AstSize
programAstSize (Program ann
_ Version
_ Term name uni fun ann
t) = Term name uni fun ann -> AstSize
forall name (uni :: * -> *) fun ann.
Term name uni fun ann -> AstSize
termAstSize Term name uni fun ann
t