From 7d8d4f131b87619996c6650c13093468ddd5ebfc Mon Sep 17 00:00:00 2001 From: David Smith Date: Thu, 2 May 2019 15:29:42 +0100 Subject: [PATCH] upgrade to ps 0.12 --- bower.json | 23 ++++++-- example/bower.json | 27 ++++++++- example/package.json | 7 ++- example/src/Main.purs | 29 ++++------ package.json | 8 ++- src/Ace/Halogen/Component.purs | 103 ++++++++++++++------------------- 6 files changed, 110 insertions(+), 87 deletions(-) diff --git a/bower.json b/bower.json index 16a72f7..743edef 100644 --- a/bower.json +++ b/bower.json @@ -27,10 +27,23 @@ "package.json" ], "dependencies": { - "purescript-ace": "^4.0.0", - "purescript-halogen": "^3.1.1", - "purescript-now": "^3.0.0", - "purescript-random": "^3.0.0", - "purescript-refs": "^3.0.0" + "purescript-ace": "^7.0.0", + "purescript-halogen": "4.0.0", + "purescript-now": "^4.0.0", + "purescript-random": "^4.0.0", + "purescript-refs": "^4.1.0", + "purescript-aff": "^5.1.1", + "purescript-foreign-object": "^2.0.1", + "purescript-prelude": "^4.1.1" + }, + "resolutions": { + "purescript-foreign-object": "^2.0.1", + "purescript-typelevel-prelude": "^4.0.0", + "purescript-web-html": "^2.0.0", + "purescript-web-uievents": "^2.0.0", + "purescript-web-file": "^2.0.0", + "purescript-web-dom": "^2.0.0", + "purescript-web-storage": "^3.0.0", + "purescript-web-events": "^2.0.0" } } diff --git a/example/bower.json b/example/bower.json index cde2f0d..6370612 100644 --- a/example/bower.json +++ b/example/bower.json @@ -1,8 +1,33 @@ { "name": "purescript-ace-halogen-example", "private": true, + "ignore": [ + "**/.*", + "bower_components", + "node_modules", + "example", + "output", + "test", + "bower.json", + "package.json" + ], "dependencies": { "purescript-ace-halogen": "*", - "ace-builds": "^1.2.2" + "purescript-prelude": "^4.1.1", + "purescript-halogen": "4.0.0", + "purescript-ace": "^7.0.0", + "purescript-aff": "^5.1.1", + "purescript-random": "^4.0.0", + "ace-builds": "^1.4.4" + }, + "resolutions": { + "purescript-foreign-object": "^2.0.1", + "purescript-typelevel-prelude": "^4.0.0", + "purescript-web-html": "^2.0.0", + "purescript-web-uievents": "^2.0.0", + "purescript-web-file": "^2.0.0", + "purescript-web-dom": "^2.0.0", + "purescript-web-storage": "^3.0.0", + "purescript-web-events": "^2.0.0" } } diff --git a/example/package.json b/example/package.json index a8b4800..73841fa 100644 --- a/example/package.json +++ b/example/package.json @@ -5,8 +5,9 @@ "build": "pulp browserify --optimise --to example.js" }, "devDependencies": { - "pulp": "^9.0.1", - "purescript": "^0.10.1", - "rimraf": "^2.5.4" + "bower": "^1.8.4", + "pulp": "^12.4.2", + "purescript": "^0.12.5", + "rimraf": "^2.6.2" } } diff --git a/example/src/Main.purs b/example/src/Main.purs index 153f0cf..7d08217 100644 --- a/example/src/Main.purs +++ b/example/src/Main.purs @@ -2,11 +2,9 @@ module Main where import Prelude -import Control.Monad.Aff (Aff) -import Control.Monad.Eff (Eff) -import Control.Monad.Eff.Class (liftEff) -import Control.Monad.Eff.Random (RANDOM) -import Control.Monad.Eff.Now (NOW) +import Effect (Effect) +import Effect.Aff (Aff) +import Effect.Class (liftEffect) import Data.Maybe (Maybe(..)) @@ -19,7 +17,7 @@ import Halogen.VDom.Driver (runUI) import Ace.Editor as Editor import Ace.EditSession as Session import Ace.Halogen.Component (AceQuery, AceMessage(..), aceComponent) -import Ace.Types (ACE, Editor) +import Ace.Types (Editor) data Query a = HandleMessage AceMessage a @@ -35,13 +33,10 @@ initialState = type AceSlot = Unit -type MainEffects = HA.HalogenEffects (random ∷ RANDOM, now ∷ NOW, ace ∷ ACE) -type MainAff = Aff MainEffects +type MainHtml = H.ParentHTML Query AceQuery AceSlot Aff +type MainDSL = H.ParentDSL State Query AceQuery AceSlot Void Aff -type MainHtml = H.ParentHTML Query AceQuery AceSlot MainAff -type MainDSL = H.ParentDSL State Query AceQuery AceSlot Void MainAff - -ui ∷ H.Component HH.HTML Query Unit Void MainAff +ui ∷ H.Component HH.HTML Query Unit Void Aff ui = H.parentComponent { initialState: const initialState @@ -58,11 +53,11 @@ ui = , HH.div_ [ HH.text state.text ] ] - component :: State → H.Component HH.HTML AceQuery Unit AceMessage MainAff + component :: State → H.Component HH.HTML AceQuery Unit AceMessage Aff component state = aceComponent (initEditor state) Nothing - initEditor ∷ State → Editor → MainAff Unit - initEditor state editor = liftEff $ do + initEditor ∷ State → Editor → Aff Unit + initEditor state editor = liftEffect $ do session ← Editor.getSession editor Session.setMode "ace/mode/yaml" session _ ← Editor.setValue state.text Nothing editor @@ -71,8 +66,8 @@ ui = eval ∷ Query ~> MainDSL eval = case _ of HandleMessage (TextChanged text) next → do - H.modify (_ { text = text }) + _ <- H.modify (_ { text = text }) pure next -main ∷ Eff MainEffects Unit +main ∷ Effect Unit main = HA.runHalogenAff (runUI ui unit =<< HA.awaitBody) diff --git a/package.json b/package.json index f69105b..f87185a 100644 --- a/package.json +++ b/package.json @@ -3,13 +3,15 @@ "scripts": { "clean": "rimraf output && rimraf .pulp-cache", "build": "eslint src && pulp build -- --censor-lib --strict", + "purs:ide": "purs ide server --log-level=debug 'bower_components/purescript-*/src/**/*.purs' 'src/**/*.purs'", "example": "bower link && cd example && bower link purescript-ace-halogen && npm run -s build" }, "devDependencies": { + "bower": "^1.8.4", "eslint": "^4.16.0", - "pulp": "^12.0.1", - "purescript": "^0.11.7", - "purescript-psa": "^0.6.0", + "pulp": "^12.4.2", + "purescript": "^0.12.5", + "purescript-psa": "^0.7.2", "rimraf": "^2.6.2" } } diff --git a/src/Ace/Halogen/Component.purs b/src/Ace/Halogen/Component.purs index 66f7840..440589a 100644 --- a/src/Ace/Halogen/Component.purs +++ b/src/Ace/Halogen/Component.purs @@ -2,7 +2,6 @@ module Ace.Halogen.Component ( aceComponent , AceQuery(..) , AceMessage(..) - , AceEffects , Autocomplete(..) , CompleteFn ) where @@ -10,35 +9,33 @@ module Ace.Halogen.Component import Prelude import Ace as Ace -import Ace.EditSession as Session import Ace.Editor as Editor +import Ace.EditSession as Session import Ace.Ext.LanguageTools as LanguageTools import Ace.Ext.LanguageTools.Completer as Completer -import Ace.Types (Editor, Completion, Position, EditSession, ACE) -import Control.Monad.Aff (Aff, runAff) -import Control.Monad.Aff.AVar (AVAR) -import Control.Monad.Aff.Class (class MonadAff) -import Control.Monad.Eff (Eff) -import Control.Monad.Eff.Now (NOW, now) -import Control.Monad.Eff.Random (random, RANDOM) -import Control.Monad.Eff.Ref (Ref, REF, readRef, writeRef, modifyRef) -import DOM (DOM) -import DOM.HTML.Types (HTMLElement) +import Ace.Types (Editor, Completion, Position, EditSession) import Data.DateTime.Instant (unInstant) import Data.Either (either) import Data.Foldable (traverse_) import Data.Maybe (Maybe(..), maybe) import Data.Newtype (unwrap) -import Data.StrMap (StrMap) -import Data.StrMap as Sm +import Effect (Effect) +import Effect.Aff (Aff, runAff) +import Effect.Aff.Class (class MonadAff) +import Effect.Now (now) +import Effect.Random (random) +import Effect.Ref (Ref, read, write, modify) +import Foreign.Object (Object) +import Foreign.Object as FO import Halogen as H import Halogen.HTML as HH import Halogen.HTML.Properties as HP +import Web.HTML (HTMLElement) -- | Effectful knot of autocomplete functions. It's needed because -- | `languageTools.addCompleter` is global and adds completer to -- | all editors -foreign import completeFns ∷ ∀ eff. Ref (StrMap (CompleteFn eff)) +foreign import completeFns ∷ Ref (Object CompleteFn) -- | This flag is used to determine if `languageTools` initialized foreign import initialized ∷ Ref Boolean @@ -49,23 +46,22 @@ foreign import focused ∷ Ref String -- | Get `dataset` property of element foreign import dataset - ∷ ∀ eff - . HTMLElement - → Eff (dom ∷ DOM | eff) (StrMap String) + ∷ HTMLElement + → Effect (Object String) -- | Take completion function for currently selected component -completeFnFocused ∷ ∀ eff. Eff (AceEffects eff) (CompleteFn eff) +completeFnFocused ∷ Effect CompleteFn completeFnFocused = do - focusedKey ← readRef focused - mFns ← readRef completeFns - maybe (pure emptyCompleteFn) pure $ Sm.lookup focusedKey mFns + focusedKey ← read focused + mFns ← read completeFns + maybe (pure emptyCompleteFn) pure $ FO.lookup focusedKey mFns where - emptyCompleteFn ∷ CompleteFn eff - emptyCompleteFn _ _ _ _ = pure [] + emptyCompleteFn ∷ CompleteFn + emptyCompleteFn _ _ _ _ = pure [] -- | Set autocomplete resume setAutocompleteResume - ∷ ∀ eff. Maybe Autocomplete → Editor → Eff (AceEffects eff) Unit + ∷ Maybe Autocomplete → Editor → Effect Unit setAutocompleteResume Nothing editor = do Editor.setEnableBasicAutocompletion false editor Editor.setEnableLiveAutocompletion false editor @@ -77,14 +73,14 @@ setAutocompleteResume (Just Live) editor = do Editor.setEnableBasicAutocompletion true editor -- | Language tools and autocomplete initializer. Runs once. -enableAutocomplete ∷ ∀ eff. Eff (AceEffects eff) Unit +enableAutocomplete ∷ Effect Unit enableAutocomplete = do - languageToolsInitialized ← readRef initialized + languageToolsInitialized ← read initialized when (not languageToolsInitialized) do completer ← Completer.mkCompleter globalCompleteFn tools ← LanguageTools.languageTools LanguageTools.addCompleter completer tools - writeRef initialized true + write true initialized where globalCompleteFn editor session position prefix cb = do fn ← completeFnFocused @@ -93,7 +89,7 @@ enableAutocomplete = do $ fn editor session position prefix -- | Generate unique key for component -genKey ∷ ∀ eff. Eff (now ∷ NOW, random ∷ RANDOM | eff) String +genKey ∷ Effect String genKey = do rn1 ← random rn2 ← random @@ -102,16 +98,6 @@ genKey = do data Autocomplete = Live | Basic -type AceEffects eff = - ( random ∷ RANDOM - , now ∷ NOW - , ref ∷ REF - , ace ∷ ACE - , avar ∷ AVAR - , dom ∷ DOM - | eff - ) - -- | Ace query algebra -- | - `SetElement` - used to capture a reference to the component's element -- | - `Init` - used internally to handle initialization of component @@ -130,7 +116,7 @@ data AceQuery a | GetText (String → a) | SetText String a | SetAutocomplete (Maybe Autocomplete) a - | SetCompleteFn (∀ eff. CompleteFn eff) a + | SetCompleteFn CompleteFn a | GetEditor (Maybe Editor → a) | HandleChange (H.SubscribeStatus -> a) @@ -140,12 +126,12 @@ data AceMessage = TextChanged String -- | The type for autocomplete function s. Takes editor, session, text position, -- | prefix, and returns array of possible completions in the `Aff` monad. -type CompleteFn eff +type CompleteFn = Editor → EditSession → Position → String - → Aff (AceEffects eff) (Array Completion) + → Aff (Array Completion) -- | Ace component state. -- | - `key` - unique key of this instance @@ -166,8 +152,8 @@ initialState = -- | The Ace component. aceComponent - ∷ ∀ eff m - . MonadAff (AceEffects eff) m + ∷ ∀ m + . MonadAff m ⇒ (Editor → m Unit) → Maybe Autocomplete → H.Component HH.HTML AceQuery Unit AceMessage m @@ -184,8 +170,9 @@ aceComponent setup resume = render ∷ AceState → H.ComponentHTML AceQuery render = const $ HH.div [ HP.ref (H.RefLabel "container") ] [] -eval ∷ ∀ eff m - . MonadAff (AceEffects eff) m +eval + ∷ ∀ m + . MonadAff m ⇒ (Editor → m Unit) → Maybe Autocomplete → AceQuery @@ -194,22 +181,22 @@ eval setup resume = case _ of Init next → do H.getHTMLElementRef (H.RefLabel "container") >>= traverse_ \el → do - key ← H.gets _.key >>= maybe (H.liftEff genKey) pure - editor ← H.liftEff $ Ace.editNode el Ace.ace + key ← H.gets _.key >>= maybe (H.liftEffect genKey) pure + editor ← H.liftEffect $ Ace.editNode el Ace.ace H.put { key: Just key, editor: Just editor } - H.liftEff do + H.liftEffect do enableAutocomplete setAutocompleteResume resume editor - Editor.onFocus editor $ writeRef focused key - session ← H.liftEff $ Editor.getSession editor - H.subscribe $ H.eventSource_ (Session.onChange session) (H.request HandleChange) + Editor.onFocus editor $ write key focused + session ← H.liftEffect $ Editor.getSession editor + H.subscribe $ H.eventSource_ (\f -> Session.onChange session (\_ -> f)) (H.request HandleChange) H.lift $ setup editor pure next Quit next → do H.gets _.key >>= traverse_ \key → - H.liftEff $ modifyRef completeFns $ Sm.delete key + H.liftEffect $ modify (FO.delete key) completeFns pure next GetEditor k → @@ -221,20 +208,20 @@ eval setup resume = case _ of SetText text next → do H.gets _.editor >>= traverse_ \editor → do - current ← H.liftEff $ Editor.getValue editor + current ← H.liftEffect $ Editor.getValue editor when (text /= current) $ void - $ H.liftEff (Editor.setValue text Nothing editor) + $ H.liftEffect (Editor.setValue text Nothing editor) pure next SetAutocomplete mbAc next → do H.gets _.editor - >>= traverse_ (H.liftEff <<< setAutocompleteResume mbAc) + >>= traverse_ (H.liftEffect <<< setAutocompleteResume mbAc) pure next SetCompleteFn fn next → do H.gets _.key >>= traverse_ \key → - H.liftEff $ modifyRef completeFns $ Sm.insert key fn + H.liftEffect $ modify (FO.insert key fn) completeFns pure next HandleChange k → do @@ -245,4 +232,4 @@ eval setup resume = case _ of getText :: DSL m String getText = - maybe (pure "") (H.liftEff <<< Editor.getValue) =<< H.gets _.editor + maybe (pure "") (H.liftEffect <<< Editor.getValue) =<< H.gets _.editor