diff --git a/plutus-playground-client/src/MainFrame/Lenses.purs b/plutus-playground-client/src/MainFrame/Lenses.purs index a26f2fdace..4e7c797ade 100644 --- a/plutus-playground-client/src/MainFrame/Lenses.purs +++ b/plutus-playground-client/src/MainFrame/Lenses.purs @@ -12,6 +12,7 @@ module MainFrame.Lenses , _lastEvaluatedSimulation , _compilationResult , _successfulCompilationResult + , _lastSuccessfulCompilationResult , _authStatus , _createGistResult , _gistUrl @@ -37,11 +38,11 @@ import Control.Monad.State.Class (class MonadState) import Cursor (Cursor) import Data.Either (Either) import Data.Json.JsonTuple (JsonTuple) -import Data.Lens (Lens', Traversal', _Right) +import Data.Lens (Lens', Traversal', _Right, lens, preview) import Data.Lens.Extra (peruse) import Data.Lens.Iso.Newtype (_Newtype) import Data.Lens.Record (prop) -import Data.Maybe (Maybe, fromMaybe) +import Data.Maybe (Maybe(..), fromMaybe) import Data.Symbol (SProxy(..)) import Editor.Types (State) as Editor import Gist (Gist) @@ -90,11 +91,20 @@ _lastEvaluatedSimulation :: Lens' State (Maybe Simulation) _lastEvaluatedSimulation = _Newtype <<< prop (SProxy :: SProxy "lastEvaluatedSimulation") _compilationResult :: Lens' State (WebData (Either InterpreterError (InterpreterResult CompilationResult))) -_compilationResult = _Newtype <<< prop (SProxy :: SProxy "compilationResult") +_compilationResult = _Newtype <<< lens g s + where + g r = r.compilationResult + + s r c = case preview (_Success <<< _Right <<< _InterpreterResult <<< _result) c of + Just cr -> r { compilationResult = c, lastSuccessfulCompilationResult = Just cr } + Nothing -> r { compilationResult = c } _successfulCompilationResult :: Traversal' State CompilationResult _successfulCompilationResult = _compilationResult <<< _Success <<< _Right <<< _InterpreterResult <<< _result +_lastSuccessfulCompilationResult :: Lens' State (Maybe CompilationResult) +_lastSuccessfulCompilationResult = _Newtype <<< prop (SProxy :: SProxy "lastSuccessfulCompilationResult") + _authStatus :: Lens' State (WebData AuthStatus) _authStatus = _Newtype <<< prop (SProxy :: SProxy "authStatus") diff --git a/plutus-playground-client/src/MainFrame/State.purs b/plutus-playground-client/src/MainFrame/State.purs index e0495e0ce2..050bc81546 100644 --- a/plutus-playground-client/src/MainFrame/State.purs +++ b/plutus-playground-client/src/MainFrame/State.purs @@ -30,7 +30,7 @@ import Data.Bifunctor (lmap) import Data.BigInteger (BigInteger) import Data.BigInteger as BigInteger import Data.Either (Either(..), note) -import Data.Lens (Traversal', _Right, assign, modifying, over, to, traversed, use, view) +import Data.Lens (assign, modifying, over, to, traversed, use, view) import Data.Lens.Extra (peruse) import Data.Lens.Fold (maximumOf, lastOf, preview) import Data.Lens.Index (ix) @@ -54,10 +54,10 @@ import Halogen (Component, hoist) import Halogen as H import Halogen.HTML (HTML) import Halogen.Query (HalogenM) -import Language.Haskell.Interpreter (CompilationError(..), InterpreterError(..), InterpreterResult, SourceCode(..), _InterpreterResult) -import MainFrame.Lenses (_actionDrag, _authStatus, _blockchainVisualisationState, _compilationResult, _contractDemos, _createGistResult, _currentDemoName, _currentView, _demoFilesMenuVisible, _editorState, _evaluationResult, _functionSchema, _gistErrorPaneVisible, _gistUrl, _lastEvaluatedSimulation, _knownCurrencies, _result, _resultRollup, _simulationActions, _simulationId, _simulationWallets, _simulations, _successfulCompilationResult, _successfulEvaluationResult, getKnownCurrencies) +import Language.Haskell.Interpreter (CompilationError(..), InterpreterError(..), SourceCode(..)) +import MainFrame.Lenses (_actionDrag, _authStatus, _blockchainVisualisationState, _compilationResult, _contractDemos, _createGistResult, _currentDemoName, _currentView, _demoFilesMenuVisible, _editorState, _evaluationResult, _functionSchema, _gistErrorPaneVisible, _gistUrl, _knownCurrencies, _lastEvaluatedSimulation, _lastSuccessfulCompilationResult, _resultRollup, _simulationActions, _simulationId, _simulationWallets, _simulations, _successfulCompilationResult, _successfulEvaluationResult, getKnownCurrencies) import MainFrame.MonadApp (class MonadApp, editorGetContents, editorHandleAction, editorSetAnnotations, editorSetContents, getGistByGistId, getOauthStatus, postGistByGistId, postContract, postEvaluation, postGist, preventDefault, resizeBalancesChart, resizeEditor, runHalogenApp, saveBuffer, scrollIntoView, setDataTransferData, setDropEffect) -import MainFrame.Types (ChildSlots, DragAndDropEventType(..), HAction(..), Query, State(..), View(..), WalletEvent(..), WebData) +import MainFrame.Types (ChildSlots, DragAndDropEventType(..), HAction(..), Query, State(..), View(..), WalletEvent(..)) import MainFrame.View (render) import Monaco (IMarkerData, markerSeverity) import Network.RemoteData (RemoteData(..), _Success, isSuccess) @@ -104,6 +104,7 @@ mkInitialState editorState = do , contractDemos , currentDemoName: Nothing , compilationResult: NotAsked + , lastSuccessfulCompilationResult: Nothing , simulations: Cursor.empty , actionDrag: Nothing , evaluationResult: NotAsked @@ -332,6 +333,7 @@ handleAction CompileProgram = do Nothing -> pure unit Just contents -> do oldCompilationResult <- use _compilationResult + oldSuccessfulCompilationResult <- use _lastSuccessfulCompilationResult assign _compilationResult Loading newCompilationResult <- postContract contents assign _compilationResult newCompilationResult @@ -353,14 +355,15 @@ handleAction CompileProgram = do -- Same thing for currencies. -- Potentially we could be smarter about this. But for now, -- let's at least be correct. + newSuccessfulCompilationResult <- use _lastSuccessfulCompilationResult let - oldSignatures = preview (_details <<< _functionSchema) oldCompilationResult + oldSignatures = view _functionSchema <$> oldSuccessfulCompilationResult - newSignatures = preview (_details <<< _functionSchema) newCompilationResult + newSignatures = view _functionSchema <$> newSuccessfulCompilationResult - oldCurrencies = preview (_details <<< _knownCurrencies) oldCompilationResult + oldCurrencies = view _knownCurrencies <$> oldSuccessfulCompilationResult - newCurrencies = preview (_details <<< _knownCurrencies) newCompilationResult + newCurrencies = view _knownCurrencies <$> newSuccessfulCompilationResult unless ( oldSignatures == newSignatures && oldCurrencies @@ -390,9 +393,6 @@ handleSimulationAction initialValue (PopulateAction n event) = do ) $ handleFormEvent initialValue event -_details :: forall a. Traversal' (WebData (Either InterpreterError (InterpreterResult a))) a -_details = _Success <<< _Right <<< _InterpreterResult <<< _result - handleGistAction :: forall m. MonadApp m => MonadState State m => GistAction -> m Unit handleGistAction PublishOrUpdateGist = do void diff --git a/plutus-playground-client/src/MainFrame/Types.purs b/plutus-playground-client/src/MainFrame/Types.purs index 9336515783..eba80dec52 100644 --- a/plutus-playground-client/src/MainFrame/Types.purs +++ b/plutus-playground-client/src/MainFrame/Types.purs @@ -52,6 +52,7 @@ newtype State , currentDemoName :: Maybe String , editorState :: Editor.State , compilationResult :: WebCompilationResult + , lastSuccessfulCompilationResult :: Maybe CompilationResult , simulations :: Cursor Simulation , actionDrag :: Maybe Int , evaluationResult :: WebEvaluationResult