fused-effects-readline 0.0.0.0 → 0.1.0.0
raw patch · 7 files changed
+75/−32 lines, 7 filesdep +exceptionsdep ~directorydep ~filepathdep ~fused-effectsnew-uploaderPVP ok
version bump matches the API change (PVP)
Dependencies added: exceptions
Dependency ranges changed: directory, filepath, fused-effects, haskeline, prettyprinter
API changes (from Hackage documentation)
- Control.Carrier.Readline.Haskeline: instance System.Console.Haskeline.MonadException.MonadException m => Control.Algebra.Algebra Control.Effect.Readline.Readline (Control.Carrier.Readline.Haskeline.ReadlineC m)
- Control.Effect.Readline: Print :: Doc AnsiStyle -> m k -> Readline m k
- Control.Effect.Readline: Prompt :: String -> (Int -> Maybe String -> m k) -> Readline m k
- Control.Effect.Readline: instance Control.Effect.Class.Effect Control.Effect.Readline.Readline
- Control.Effect.Readline: instance Control.Effect.Class.HFunctor Control.Effect.Readline.Readline
- Control.Effect.Readline: instance GHC.Base.Functor m => GHC.Base.Functor (Control.Effect.Readline.Readline m)
- Control.Effect.Readline: instance GHC.Generics.Generic1 (Control.Effect.Readline.Readline m)
+ Control.Carrier.Readline.Haskeline: instance (Control.Monad.IO.Class.MonadIO m, Control.Monad.Catch.MonadMask m) => Control.Algebra.Algebra Control.Effect.Readline.Readline (Control.Carrier.Readline.Haskeline.ReadlineC m)
+ Control.Effect.Readline: [Print] :: Doc AnsiStyle -> Readline m ()
+ Control.Effect.Readline: [Prompt] :: String -> Readline m (Int, Maybe String)
- Control.Carrier.Readline.Haskeline: runReadline :: MonadException m => Prefs -> Settings m -> ReadlineC m a -> m a
+ Control.Carrier.Readline.Haskeline: runReadline :: (MonadIO m, MonadMask m) => Prefs -> Settings m -> ReadlineC m a -> m a
- Control.Carrier.Readline.Haskeline: runReadlineWithHistory :: MonadException m => ReadlineC m a -> m a
+ Control.Carrier.Readline.Haskeline: runReadlineWithHistory :: (MonadIO m, MonadMask m) => ReadlineC m a -> m a
- Control.Effect.Readline: class (HFunctor sig, Monad m) => Algebra (sig :: Type -> Type -> Type -> Type) (m :: Type -> Type) | m -> sig
+ Control.Effect.Readline: class Monad m => Algebra (sig :: Type -> Type -> Type -> Type) (m :: Type -> Type) | m -> sig
- Control.Effect.Readline: data Readline m k
+ Control.Effect.Readline: data Readline (m :: Type -> Type) (k :: Type)
Files
- CHANGELOG.md +7/−0
- LICENSE +1/−1
- README.md +3/−0
- fused-effects-readline.cabal +23/−10
- src/Control/Carrier/Readline/Haskeline.hs +31/−10
- src/Control/Effect/Readline.hs +8/−11
- test/Test.hs +2/−0
CHANGELOG.md view
@@ -1,3 +1,10 @@+# v0.1.0.0++- Support for `ghc` 8.10.+- Support for `haskeline` 0.8.+- Support for `fused-effects` 1.1++ # v0.0.0.0 Initial release.
LICENSE view
@@ -1,6 +1,6 @@ BSD 3-Clause License -Copyright (c) 2019, Rob Rix+Copyright (c) 2019-2020, Rob Rix All rights reserved. Redistribution and use in source and binary forms, with or without
+ README.md view
@@ -0,0 +1,3 @@+# `fused-effects-readline`++A `readline`-like effect & carrier for `fused-effects`.
fused-effects-readline.cabal view
@@ -1,7 +1,7 @@ cabal-version: 2.2 name: fused-effects-readline-version: 0.0.0.0+version: 0.1.0.0 synopsis: A readline-like effect and carrier for fused-effects description: A readline-like effect and carrier for fused-effects, using haskeline under the hood homepage: https://github.com/fused-effects/fused-effects-readline@@ -10,11 +10,17 @@ license-file: LICENSE author: Rob Rix maintainer: rob.rix@me.com-copyright: 2019 Rob Rix+copyright: 2019-2020 Rob Rix category: Development extra-source-files:+ README.md CHANGELOG.md +tested-with:+ GHC == 8.6.5+ GHC == 8.8.3+ GHC == 8.10.1+ common common default-language: Haskell2010 ghc-options:@@ -28,10 +34,14 @@ -Wno-name-shadowing -Wno-safe -Wno-unsafe- if (impl(ghc >= 8.6))+ if impl(ghc >= 8.6) ghc-options: -Wno-star-is-type- if (impl(ghc >= 8.8))+ if impl(ghc >= 8.8) ghc-options: -Wno-missing-deriving-strategies+ if impl(ghc >= 8.10)+ ghc-options:+ -Wno-missing-safe-haskell-mode+ -Wno-prepositive-qualified-module library import: common@@ -40,15 +50,18 @@ Control.Carrier.Readline.Haskeline Control.Effect.Readline build-depends:- base >= 4.12 && < 5- , directory ^>= 1.3.3.2- , filepath ^>= 1.4.2.1- , fused-effects ^>= 1- , haskeline ^>= 0.7- , prettyprinter ^>= 1.5+ , base >= 4.12 && < 5+ , directory ^>= 1.3+ , filepath ^>= 1.4+ , fused-effects ^>= 1.1+ , haskeline >= 0.7 && < 0.9+ , prettyprinter >= 1.5 && <1.7 , prettyprinter-ansi-terminal ^>= 1.1 , terminal-size ^>= 0.3 , transformers >= 0.4 && < 0.6+ if impl(ghc >= 8.10)+ build-depends:+ , exceptions ^>= 0.10 test-suite test import: common
src/Control/Carrier/Readline/Haskeline.hs view
@@ -1,4 +1,10 @@-{-# LANGUAGE GeneralizedNewtypeDeriving, LambdaCase, MultiParamTypeClasses, ScopedTypeVariables, TypeApplications #-}+{-# LANGUAGE CPP #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeApplications #-}+{-# OPTIONS_GHC -Wno-redundant-constraints #-} module Control.Carrier.Readline.Haskeline ( -- * Readline carrier runReadline@@ -12,10 +18,12 @@ import Control.Carrier.Lift import Control.Carrier.Reader import Control.Effect.Readline+#if MIN_VERSION_haskeline(0, 8, 0)+import Control.Monad.Catch (MonadMask(..))+#endif import Control.Monad.Fix (MonadFix) import Control.Monad.IO.Class (MonadIO(..)) import Control.Monad.Trans.Class (MonadTrans(..))-import Data.Coerce (coerce) import Data.Text.Prettyprint.Doc import Data.Text.Prettyprint.Doc.Render.Terminal import System.Console.Haskeline@@ -25,10 +33,18 @@ import System.FilePath import System.IO (stdout) +#if MIN_VERSION_haskeline(0, 8, 0)+runReadline :: (MonadIO m, MonadMask m) => Prefs -> Settings m -> ReadlineC m a -> m a+#else runReadline :: MonadException m => Prefs -> Settings m -> ReadlineC m a -> m a-runReadline prefs settings (ReadlineC m) = runInputTWithPrefs prefs (coerce settings) (runM (runReader (Line 0) m))+#endif+runReadline prefs settings (ReadlineC m) = runInputTWithPrefs prefs settings (runM (runReader (Line 0) m)) +#if MIN_VERSION_haskeline(0, 8, 0)+runReadlineWithHistory :: (MonadIO m, MonadMask m) => ReadlineC m a -> m a+#else runReadlineWithHistory :: MonadException m => ReadlineC m a -> m a+#endif runReadlineWithHistory block = do homeDir <- liftIO getHomeDirectory prefs <- liftIO $ readPrefs (homeDir </> ".haskeline")@@ -43,24 +59,29 @@ runReadline prefs settings block -newtype ReadlineC m a = ReadlineC { runReadlineC :: ReaderC Line (LiftC (InputT m)) a }+newtype ReadlineC m a = ReadlineC (ReaderC Line (LiftC (InputT m)) a) deriving (Applicative, Functor, Monad, MonadFix, MonadIO) instance MonadTrans ReadlineC where lift = ReadlineC . lift . lift . lift +#if MIN_VERSION_haskeline(0, 8, 0)+instance (MonadIO m, MonadMask m) => Algebra Readline (ReadlineC m) where+#else instance MonadException m => Algebra Readline (ReadlineC m) where- alg = \case- Prompt prompt k -> ReadlineC $ do+#endif+ alg _ sig ctx = case sig of+ Prompt prompt -> ReadlineC $ do str <- sendM (getInputLine @m (cyan <> prompt <> plain)) Line line <- ask- local increment (runReadlineC (k line str))+ local increment $ pure ((line, str) <$ ctx) where cyan = "\ESC[1;36m\STX" plain = "\ESC[0m\STX"- Print doc k -> do+ Print doc -> do s <- maybe 80 Size.width <$> liftIO size- liftIO (renderIO stdout (layoutSmart defaultLayoutOptions { layoutPageWidth = AvailablePerLine s 0.8 } (doc <> line)))- k+ let docstream = layoutSmart (layoutOptions s) (doc <> line)+ (<$ ctx) <$> (liftIO . renderIO stdout $ docstream)+ where layoutOptions s = defaultLayoutOptions { layoutPageWidth = AvailablePerLine s 0.8 } newtype Line = Line Int
src/Control/Effect/Readline.hs view
@@ -1,4 +1,5 @@-{-# LANGUAGE DeriveFunctor, DeriveGeneric #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE KindSignatures #-} module Control.Effect.Readline ( -- * Readline effect Readline(..)@@ -11,22 +12,18 @@ ) where import Control.Algebra+import Data.Kind (Type) import Data.Text.Prettyprint.Doc (Doc) import Data.Text.Prettyprint.Doc.Render.Terminal (AnsiStyle)-import GHC.Generics (Generic1) import Prelude hiding (print) prompt :: Has Readline sig m => String -> m (Int, Maybe String)-prompt p = send (Prompt p (curry pure))+prompt p = send (Prompt p) print :: Has Readline sig m => Doc AnsiStyle -> m ()-print s = send (Print s (pure ()))+print s = send (Print s) -data Readline m k- = Prompt String (Int -> Maybe String -> m k)- | Print (Doc AnsiStyle) (m k)- deriving (Functor, Generic1)--instance HFunctor Readline-instance Effect Readline+data Readline (m :: Type -> Type) (k :: Type) where+ Prompt :: String -> Readline m (Int, Maybe String)+ Print :: Doc AnsiStyle -> Readline m ()
test/Test.hs view
@@ -2,5 +2,7 @@ ( main ) where +import Control.Carrier.Readline.Haskeline ()+ main :: IO () main = pure ()