From 96940188ea46620f9c63f22e1cdb9a36ab08685a Mon Sep 17 00:00:00 2001 From: Sjoerd Visscher Date: Fri, 8 Oct 2021 12:52:42 +0200 Subject: [PATCH 1/3] Keep simulation state after compilation error --- .../src/MainFrame/Lenses.purs | 4 ++++ plutus-playground-client/src/MainFrame/State.purs | 15 ++++++++++----- plutus-playground-client/src/MainFrame/Types.purs | 1 + 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/plutus-playground-client/src/MainFrame/Lenses.purs b/plutus-playground-client/src/MainFrame/Lenses.purs index a26f2fdace..118fef4119 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 @@ -95,6 +96,9 @@ _compilationResult = _Newtype <<< prop (SProxy :: SProxy "compilationResult") _successfulCompilationResult :: Traversal' State CompilationResult _successfulCompilationResult = _compilationResult <<< _Success <<< _Right <<< _InterpreterResult <<< _result +_lastSuccessfulCompilationResult :: Lens' State (WebData (Either InterpreterError (InterpreterResult 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..210f258c48 100644 --- a/plutus-playground-client/src/MainFrame/State.purs +++ b/plutus-playground-client/src/MainFrame/State.purs @@ -55,7 +55,7 @@ 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 MainFrame.Lenses (_actionDrag, _authStatus, _blockchainVisualisationState, _compilationResult, _contractDemos, _createGistResult, _currentDemoName, _currentView, _demoFilesMenuVisible, _editorState, _evaluationResult, _functionSchema, _gistErrorPaneVisible, _gistUrl, _lastEvaluatedSimulation, _lastSuccessfulCompilationResult, _knownCurrencies, _result, _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.View (render) @@ -104,6 +104,7 @@ mkInitialState editorState = do , contractDemos , currentDemoName: Nothing , compilationResult: NotAsked + , lastSuccessfulCompilationResult: NotAsked , simulations: Cursor.empty , actionDrag: Nothing , evaluationResult: NotAsked @@ -256,6 +257,7 @@ handleAction (LoadScript key) = do assign (_editorState <<< _lastCompiledCode) (Just contractDemoEditorContents) assign (_editorState <<< _currentCodeIsCompiled) true assign _compilationResult (Success <<< Right $ contractDemoContext) + assign _lastSuccessfulCompilationResult (Success <<< Right $ contractDemoContext) assign _evaluationResult NotAsked assign _createGistResult NotAsked @@ -332,6 +334,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 @@ -342,6 +345,7 @@ handleAction CompileProgram = do when (isSuccess newCompilationResult) do assign (_editorState <<< _lastCompiledCode) (Just contents) assign (_editorState <<< _currentCodeIsCompiled) true + assign _lastSuccessfulCompilationResult newCompilationResult -- Update the error display. editorSetAnnotations $ case newCompilationResult of @@ -353,14 +357,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 = preview (_details <<< _functionSchema) oldSuccessfulCompilationResult - newSignatures = preview (_details <<< _functionSchema) newCompilationResult + newSignatures = preview (_details <<< _functionSchema) newSuccessfulCompilationResult - oldCurrencies = preview (_details <<< _knownCurrencies) oldCompilationResult + oldCurrencies = preview (_details <<< _knownCurrencies) oldSuccessfulCompilationResult - newCurrencies = preview (_details <<< _knownCurrencies) newCompilationResult + newCurrencies = preview (_details <<< _knownCurrencies) newSuccessfulCompilationResult unless ( oldSignatures == newSignatures && oldCurrencies diff --git a/plutus-playground-client/src/MainFrame/Types.purs b/plutus-playground-client/src/MainFrame/Types.purs index 9336515783..51b0538435 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 :: WebCompilationResult , simulations :: Cursor Simulation , actionDrag :: Maybe Int , evaluationResult :: WebEvaluationResult From 5ea55a1871247c3359e27b284373feb388d38f4b Mon Sep 17 00:00:00 2001 From: Sjoerd Visscher Date: Tue, 12 Oct 2021 14:53:58 +0200 Subject: [PATCH 2/3] Automatically assign to lastSuccessfulCompilationResult if compilationResult is updated --- .../src/MainFrame/Lenses.purs | 14 +++++++---- .../src/MainFrame/State.purs | 23 ++++++++----------- .../src/MainFrame/Types.purs | 2 +- 3 files changed, 20 insertions(+), 19 deletions(-) diff --git a/plutus-playground-client/src/MainFrame/Lenses.purs b/plutus-playground-client/src/MainFrame/Lenses.purs index 118fef4119..4e7c797ade 100644 --- a/plutus-playground-client/src/MainFrame/Lenses.purs +++ b/plutus-playground-client/src/MainFrame/Lenses.purs @@ -38,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) @@ -91,12 +91,18 @@ _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 (WebData (Either InterpreterError (InterpreterResult CompilationResult))) +_lastSuccessfulCompilationResult :: Lens' State (Maybe CompilationResult) _lastSuccessfulCompilationResult = _Newtype <<< prop (SProxy :: SProxy "lastSuccessfulCompilationResult") _authStatus :: Lens' State (WebData AuthStatus) diff --git a/plutus-playground-client/src/MainFrame/State.purs b/plutus-playground-client/src/MainFrame/State.purs index 210f258c48..621ad791d9 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 (_Just, 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, _lastSuccessfulCompilationResult, _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,7 +104,7 @@ mkInitialState editorState = do , contractDemos , currentDemoName: Nothing , compilationResult: NotAsked - , lastSuccessfulCompilationResult: NotAsked + , lastSuccessfulCompilationResult: Nothing , simulations: Cursor.empty , actionDrag: Nothing , evaluationResult: NotAsked @@ -257,7 +257,6 @@ handleAction (LoadScript key) = do assign (_editorState <<< _lastCompiledCode) (Just contractDemoEditorContents) assign (_editorState <<< _currentCodeIsCompiled) true assign _compilationResult (Success <<< Right $ contractDemoContext) - assign _lastSuccessfulCompilationResult (Success <<< Right $ contractDemoContext) assign _evaluationResult NotAsked assign _createGistResult NotAsked @@ -345,7 +344,6 @@ handleAction CompileProgram = do when (isSuccess newCompilationResult) do assign (_editorState <<< _lastCompiledCode) (Just contents) assign (_editorState <<< _currentCodeIsCompiled) true - assign _lastSuccessfulCompilationResult newCompilationResult -- Update the error display. editorSetAnnotations $ case newCompilationResult of @@ -359,13 +357,13 @@ handleAction CompileProgram = do -- let's at least be correct. newSuccessfulCompilationResult <- use _lastSuccessfulCompilationResult let - oldSignatures = preview (_details <<< _functionSchema) oldSuccessfulCompilationResult + oldSignatures = preview (_Just <<< _functionSchema) oldSuccessfulCompilationResult - newSignatures = preview (_details <<< _functionSchema) newSuccessfulCompilationResult + newSignatures = preview (_Just <<< _functionSchema) newSuccessfulCompilationResult - oldCurrencies = preview (_details <<< _knownCurrencies) oldSuccessfulCompilationResult + oldCurrencies = preview (_Just <<< _knownCurrencies) oldSuccessfulCompilationResult - newCurrencies = preview (_details <<< _knownCurrencies) newSuccessfulCompilationResult + newCurrencies = preview (_Just <<< _knownCurrencies) newSuccessfulCompilationResult unless ( oldSignatures == newSignatures && oldCurrencies @@ -395,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 51b0538435..eba80dec52 100644 --- a/plutus-playground-client/src/MainFrame/Types.purs +++ b/plutus-playground-client/src/MainFrame/Types.purs @@ -52,7 +52,7 @@ newtype State , currentDemoName :: Maybe String , editorState :: Editor.State , compilationResult :: WebCompilationResult - , lastSuccessfulCompilationResult :: WebCompilationResult + , lastSuccessfulCompilationResult :: Maybe CompilationResult , simulations :: Cursor Simulation , actionDrag :: Maybe Int , evaluationResult :: WebEvaluationResult From bffb5f3c3dcbf05fc05c8918350eb8c0251e258c Mon Sep 17 00:00:00 2001 From: Sjoerd Visscher Date: Thu, 14 Oct 2021 13:51:12 +0200 Subject: [PATCH 3/3] Simplify --- plutus-playground-client/src/MainFrame/State.purs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/plutus-playground-client/src/MainFrame/State.purs b/plutus-playground-client/src/MainFrame/State.purs index 621ad791d9..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 (_Just, 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) @@ -357,13 +357,13 @@ handleAction CompileProgram = do -- let's at least be correct. newSuccessfulCompilationResult <- use _lastSuccessfulCompilationResult let - oldSignatures = preview (_Just <<< _functionSchema) oldSuccessfulCompilationResult + oldSignatures = view _functionSchema <$> oldSuccessfulCompilationResult - newSignatures = preview (_Just <<< _functionSchema) newSuccessfulCompilationResult + newSignatures = view _functionSchema <$> newSuccessfulCompilationResult - oldCurrencies = preview (_Just <<< _knownCurrencies) oldSuccessfulCompilationResult + oldCurrencies = view _knownCurrencies <$> oldSuccessfulCompilationResult - newCurrencies = preview (_Just <<< _knownCurrencies) newSuccessfulCompilationResult + newCurrencies = view _knownCurrencies <$> newSuccessfulCompilationResult unless ( oldSignatures == newSignatures && oldCurrencies