{-# LANGUAGE TemplateHaskell #-}

module PlutusCore.Compiler.Opts
  ( CompilationOpts (..)
  , coOptimizeOpts
  , coBuiltinSemanticsVariant
  , defaultCompilationOpts
  ) where

import Control.Lens (makeLenses)
import Data.Default.Class (Default (def))
import PlutusCore.Builtin.Meaning (BuiltinSemanticsVariant)
import UntypedPlutusCore.Optimize.Opts (OptimizeOpts, defaultOptimizeOpts)

data CompilationOpts name fun a = CompilationOpts
  { forall name fun a.
CompilationOpts name fun a -> OptimizeOpts name a
_coOptimizeOpts :: OptimizeOpts name a
  , forall name fun a.
CompilationOpts name fun a -> BuiltinSemanticsVariant fun
_coBuiltinSemanticsVariant :: BuiltinSemanticsVariant fun
  }

$(makeLenses ''CompilationOpts)

defaultCompilationOpts :: Default (BuiltinSemanticsVariant fun) => CompilationOpts name fun a
defaultCompilationOpts :: forall fun name a.
Default (BuiltinSemanticsVariant fun) =>
CompilationOpts name fun a
defaultCompilationOpts =
  CompilationOpts
    { _coOptimizeOpts :: OptimizeOpts name a
_coOptimizeOpts = OptimizeOpts name a
forall name a. OptimizeOpts name a
defaultOptimizeOpts
    , _coBuiltinSemanticsVariant :: BuiltinSemanticsVariant fun
_coBuiltinSemanticsVariant = BuiltinSemanticsVariant fun
forall a. Default a => a
def
    }