ascii-case 1.0.1.2 → 1.0.1.3
raw patch · 4 files changed
+91/−98 lines, 4 filesdep ~basePVP ok
version bump matches the API change (PVP)
Dependency ranges changed: base
API changes (from Hackage documentation)
Files
- ascii-case.cabal +11/−14
- changelog.md +4/−0
- library/ASCII/Case.hs +52/−60
- test/Main.hs +24/−24
ascii-case.cabal view
@@ -1,7 +1,7 @@ cabal-version: 3.0 name: ascii-case-version: 1.0.1.2+version: 1.0.1.3 synopsis: ASCII letter case category: Data, Text @@ -25,29 +25,26 @@ location: git://github.com/typeclasses/ascii-case.git common base- default-language: Haskell2010+ default-language: GHC2021 ghc-options: -Wall default-extensions:+ BlockArguments+ DeriveAnyClass+ DerivingStrategies+ LambdaCase NoImplicitPrelude build-depends:- ascii-char ^>= 1.0- , base ^>= 4.14 || ^>= 4.15 || ^>= 4.16 || ^>= 4.17+ , ascii-char ^>= 1.0+ , base ^>= 4.16 || ^>= 4.17 || ^>= 4.18 library import: base hs-source-dirs: library - default-extensions:- StandaloneDeriving- DerivingStrategies- DeriveAnyClass- DeriveDataTypeable- DeriveGeneric- build-depends:- hashable ^>= 1.3.5 || ^>= 1.4+ , hashable ^>= 1.3.5 || ^>= 1.4 exposed-modules: ASCII.Case@@ -59,5 +56,5 @@ main-is: Main.hs build-depends:- ascii-case- , hspec ^>= 2.8.5 || ^>= 2.9 || ^>= 2.10+ , ascii-case+ , hspec ^>= 2.8.5 || ^>= 2.9 || ^>= 2.10 || ^>= 2.11
changelog.md view
@@ -1,3 +1,7 @@+### 1.0.1.3 (2023-06-21)++Dropped support for GHC 9.0 (base 4.15)+ ### 1.0.1.2 (2023-01-01) Minor Cabal correction (change `extra-doc-files` to `extra-source-files`)
library/ASCII/Case.hs view
@@ -1,14 +1,13 @@-{- |--/Case/ is a property of letters. /A-Z/ are /upper case/ letters, and-/a-z/ are /lower case/ letters. No other ASCII characters have case.---}--module ASCII.Case ( Case (..), letterCase, isCase, toCase, opposite ) where+-- |+--+-- /Case/ is a property of letters. /A-Z/ are /upper case/ letters, and+-- /a-z/ are /lower case/ letters. No other ASCII characters have case.+module ASCII.Case (Case (..), letterCase, isCase, toCase, opposite) where import ASCII.Char (Char (..))+import ASCII.Char qualified as Char import Data.Bool (Bool, otherwise)+import Data.Bool qualified as Bool import Data.Data (Data) import Data.Eq (Eq) import Data.Function ((.))@@ -16,15 +15,14 @@ import Data.Maybe (Maybe (..)) import Data.Ord (Ord, (<=), (>=)) import GHC.Generics (Generic)-import Prelude (Bounded, Enum, Int, (+), (-)) import Text.Show (Show)--import qualified ASCII.Char as Char-import qualified Data.Bool as Bool+import Prelude (Bounded, Enum, Int, (+), (-)) -data Case =- UpperCase -- ^ The letters from 'CapitalLetterA' to 'CapitalLetterZ'.- | LowerCase -- ^ The letters from 'SmallLetterA' to 'SmallLetterZ'.+data Case+ = -- | The letters from 'CapitalLetterA' to 'CapitalLetterZ'.+ UpperCase+ | -- | The letters from 'SmallLetterA' to 'SmallLetterZ'.+ LowerCase deriving stock instance Eq Case @@ -42,67 +40,61 @@ deriving anyclass instance Hashable Case -{- | Determines whether a character is a letter, and if so, whether it is upper or lower case.-->>> map letterCase [CapitalLetterR, SmallLetterR, DollarSign]-[Just UpperCase,Just LowerCase,Nothing]---}-+-- | Determines whether a character is a letter, and if so, whether it is upper or lower case.+--+-- >>> map letterCase [CapitalLetterR, SmallLetterR, DollarSign]+-- [Just UpperCase,Just LowerCase,Nothing] letterCase :: Char -> Maybe Case-letterCase x | isCase UpperCase x = Just UpperCase- | isCase LowerCase x = Just LowerCase- | otherwise = Nothing--{- | Determines whether a character is a letter of a particular case.-->>> map (isCase UpperCase) [CapitalLetterR,SmallLetterR,DollarSign]-[True,False,False]---}+letterCase x+ | isCase UpperCase x = Just UpperCase+ | isCase LowerCase x = Just LowerCase+ | otherwise = Nothing +-- | Determines whether a character is a letter of a particular case.+--+-- >>> map (isCase UpperCase) [CapitalLetterR,SmallLetterR,DollarSign]+-- [True,False,False] isCase :: Case -> Char -> Bool-isCase c x = (Bool.&&) ( x >= a ) ( x <= z ) where (a, z) = az c+isCase c x = (Bool.&&) (x >= a) (x <= z) where (a, z) = az c az :: Case -> (Char, Char)-az UpperCase = (CapitalLetterA, CapitalLetterZ)-az LowerCase = (SmallLetterA, SmallLetterZ)--{- | Maps a letter character to its upper/lower case equivalent.-->>> toCase UpperCase SmallLetterX-CapitalLetterX-->>> toCase LowerCase CapitalLetterF-SmallLetterF--Characters that are already in the requested case are unmodified by this transformation.-->>> toCase UpperCase CapitalLetterA-CapitalLetterA--Characters that are not letters, such as exclamation mark, are unmodified by this transformation.-->>> toCase UpperCase ExclamationMark-ExclamationMark---}+az = \case+ UpperCase -> (CapitalLetterA, CapitalLetterZ)+ LowerCase -> (SmallLetterA, SmallLetterZ) +-- | Maps a letter character to its upper/lower case equivalent.+--+-- >>> toCase UpperCase SmallLetterX+-- CapitalLetterX+--+-- >>> toCase LowerCase CapitalLetterF+-- SmallLetterF+--+-- Characters that are already in the requested case are unmodified by this transformation.+--+-- >>> toCase UpperCase CapitalLetterA+-- CapitalLetterA+--+-- Characters that are not letters, such as exclamation mark, are unmodified by this transformation.+--+-- >>> toCase UpperCase ExclamationMark+-- ExclamationMark toCase :: Case -> Char -> Char toCase c x = if isCase (opposite c) x then changeCaseUnsafe c x else x -- | Change a letter to the given case, assuming that the input character is a letter of the opposite case.- changeCaseUnsafe :: Case -> Char -> Char changeCaseUnsafe c = charAsIntUnsafe (changeCaseInt c) changeCaseInt :: Case -> Int -> Int-changeCaseInt LowerCase i = i + 32-changeCaseInt UpperCase i = i - 32+changeCaseInt c i = case c of+ LowerCase -> i + 32+ UpperCase -> i - 32 opposite :: Case -> Case-opposite UpperCase = LowerCase-opposite LowerCase = UpperCase+opposite = \case+ UpperCase -> LowerCase+ LowerCase -> UpperCase charAsIntUnsafe :: (Int -> Int) -> (Char -> Char) charAsIntUnsafe f = Char.fromIntUnsafe . f . Char.toInt
test/Main.hs view
@@ -1,37 +1,37 @@ module Main (main) where import ASCII.Case-+ ( Case (LowerCase, UpperCase),+ isCase,+ letterCase,+ toCase,+ ) import ASCII.Char (Char (..))- import Data.Bool (Bool (..))-import Data.Function (($)) import Data.Maybe (Maybe (..)) import System.IO (IO) import Test.Hspec (hspec, it, shouldBe) main :: IO ()-main = hspec $ do-- it "letterCase" $ do- let f = letterCase- f CapitalLetterR `shouldBe` Just UpperCase- f SmallLetterR `shouldBe` Just LowerCase- f DollarSign `shouldBe` Nothing-+main = hspec do+ it "letterCase" do+ let f = letterCase+ f CapitalLetterR `shouldBe` Just UpperCase+ f SmallLetterR `shouldBe` Just LowerCase+ f DollarSign `shouldBe` Nothing - it "isCase UpperCase" $ do- let f = isCase UpperCase- f CapitalLetterR `shouldBe` True- f SmallLetterR `shouldBe` False- f DollarSign `shouldBe` False+ it "isCase UpperCase" do+ let f = isCase UpperCase+ f CapitalLetterR `shouldBe` True+ f SmallLetterR `shouldBe` False+ f DollarSign `shouldBe` False - it "toCase UpperCase" $ do- let f = toCase UpperCase- f SmallLetterX `shouldBe` CapitalLetterX- f CapitalLetterA `shouldBe` CapitalLetterA- f ExclamationMark `shouldBe` ExclamationMark+ it "toCase UpperCase" do+ let f = toCase UpperCase+ f SmallLetterX `shouldBe` CapitalLetterX+ f CapitalLetterA `shouldBe` CapitalLetterA+ f ExclamationMark `shouldBe` ExclamationMark - it "toCase LowerCase" $ do- let f = toCase LowerCase- f CapitalLetterF `shouldBe` SmallLetterF+ it "toCase LowerCase" do+ let f = toCase LowerCase+ f CapitalLetterF `shouldBe` SmallLetterF