ascii-group 1.0.0.4 → 1.0.0.6
raw patch · 5 files changed
+177/−116 lines, 5 filesdep +ascii-groupdep ~ascii-chardep ~basePVP ok
version bump matches the API change (PVP)
Dependencies added: ascii-group
Dependency ranges changed: ascii-char, base
API changes (from Hackage documentation)
Files
- ASCII/Group.hs +0/−113
- ascii-group.cabal +13/−3
- changelog.txt +1/−0
- library/ASCII/Group.hs +106/−0
- test/test.hs +57/−0
− ASCII/Group.hs
@@ -1,113 +0,0 @@-{- |--ASCII characters are broadly categorized into two groups: /control codes/ and /printable characters/.---}--module ASCII.Group- (- {- * The @Group@ type -} Group (..),- {- * Functions -} charGroup, inGroup- {- * Notes -} {- $notes -}- )- where--import ASCII.Char ( Char )-import Data.Bool ( Bool )-import Data.Data ( Data )-import Data.Eq ( Eq, (==) )-import Data.Hashable ( Hashable )-import Data.Ord ( Ord, (<) )-import GHC.Generics ( Generic )-import Prelude ( Enum, Bounded )-import Text.Show ( Show )--import qualified ASCII.Char as Char--{- $setup-->>> import Prelude->>> import ASCII.Char---}--data Group =- Control -- ^ 33 of the ASCII characters are /control codes/. A few of these are still in use, but most are obsolete relics of the early days of computing.- | Printable -- ^ 95 of the ASCII characters are /printable characters/ such as letters and numbers, mostly corresponding to the keys on an American English keyboard.--deriving stock instance Eq Group--deriving stock instance Ord Group--deriving stock instance Enum Group--deriving stock instance Bounded Group--deriving stock instance Show Group--deriving stock instance Data Group--deriving stock instance Generic Group--deriving anyclass instance Hashable Group--{- | Determine which group a particular character belongs to.-->>> map charGroup [CapitalLetterA,EndOfTransmission]-[Printable,Control]---}--charGroup :: Char -> Group-charGroup x =- case x of- _ | (x < Char.Space) -> Control- Char.Delete -> Control- _ -> Printable--{- | Test whether a character belongs to a particular group.-->>> inGroup Printable EndOfTransmission-False-->>> inGroup Control EndOfTransmission-True---}--inGroup :: Group -> Char -> Bool-inGroup g x = charGroup x == g--{- $notes--Space is a printable character (perhaps surprisingly, given that it is invisible).-->>> charGroup Space-Printable--Tab is a control code (perhaps surprisingly, given that space is a printable character).-->>> charGroup HorizontalTab-Control--A few examples of printable characters:-->>> all (inGroup Printable) [CapitalLetterA,SmallLetterZ,Digit4,Tilde]-True--A few examples of control characters:-->>> all (inGroup Control) [Null,Substitute,UnitSeparator,Delete]-True--There are 33 control codes.-->>> length (filter (inGroup Control) allCharacters)-33--There are 95 printable characters.-->>> length (filter (inGroup Printable) allCharacters)-95---}
ascii-group.cabal view
@@ -1,7 +1,7 @@ cabal-version: 2.0 name: ascii-group-version: 1.0.0.4+version: 1.0.0.6 synopsis: ASCII character groups category: Data, Text @@ -18,8 +18,6 @@ build-type: Simple -tested-with: GHC == 9.0.1, GHC == 8.10.1, GHC == 8.8.1, GHC == 8.6.5, GHC == 8.4.3- extra-source-files: changelog.txt source-repository head@@ -35,6 +33,7 @@ default-extensions: DeriveDataTypeable default-extensions: DeriveGeneric ghc-options: -Wall+ hs-source-dirs: library build-depends: ascii-char ^>= 1.0 @@ -42,3 +41,14 @@ build-depends: hashable >= 1.2 && < 1.4 exposed-modules: ASCII.Group++test-suite test+ type: exitcode-stdio-1.0+ default-language: Haskell2010+ default-extensions: NoImplicitPrelude+ default-extensions: OverloadedStrings+ default-extensions: QuasiQuotes+ ghc-options: -Wall+ hs-source-dirs: test+ main-is: test.hs+ build-depends: ascii-char, ascii-group, base
changelog.txt view
@@ -1,3 +1,4 @@ 1.0.0.0 - 2020-05-05 - Initial release 1.0.0.2 - 2020-05-18 - Support GHC 8.10 1.0.0.4 - 2021-02-10 - Support GHC 9.0+1.0.0.6 - 2021-09-26 - Add a test suite
+ library/ASCII/Group.hs view
@@ -0,0 +1,106 @@+{- |++ASCII characters are broadly categorized into two groups: /control codes/ and /printable characters/.++-}++module ASCII.Group+ (+ {- * The @Group@ type -} Group (..),+ {- * Functions -} charGroup, inGroup+ {- * Notes -} {- $notes -}+ )+ where++import ASCII.Char ( Char )+import Data.Bool ( Bool )+import Data.Data ( Data )+import Data.Eq ( Eq, (==) )+import Data.Hashable ( Hashable )+import Data.Ord ( Ord, (<) )+import GHC.Generics ( Generic )+import Prelude ( Enum, Bounded )+import Text.Show ( Show )++import qualified ASCII.Char as Char++data Group =+ Control -- ^ 33 of the ASCII characters are /control codes/. A few of these are still in use, but most are obsolete relics of the early days of computing.+ | Printable -- ^ 95 of the ASCII characters are /printable characters/ such as letters and numbers, mostly corresponding to the keys on an American English keyboard.++deriving stock instance Eq Group++deriving stock instance Ord Group++deriving stock instance Enum Group++deriving stock instance Bounded Group++deriving stock instance Show Group++deriving stock instance Data Group++deriving stock instance Generic Group++deriving anyclass instance Hashable Group++{- | Determine which group a particular character belongs to.++>>> map charGroup [CapitalLetterA,EndOfTransmission]+[Printable,Control]++-}++charGroup :: Char -> Group+charGroup x =+ case x of+ _ | (x < Char.Space) -> Control+ Char.Delete -> Control+ _ -> Printable++{- | Test whether a character belongs to a particular group.++>>> inGroup Printable EndOfTransmission+False++>>> inGroup Control EndOfTransmission+True++-}++inGroup :: Group -> Char -> Bool+inGroup g x = charGroup x == g++{- $notes++Space is a printable character (perhaps surprisingly, given that it is invisible).++>>> charGroup Space+Printable++Tab is a control code (perhaps surprisingly, given that space is a printable character).++>>> charGroup HorizontalTab+Control++A few examples of printable characters:++>>> all (inGroup Printable) [CapitalLetterA,SmallLetterZ,Digit4,Tilde]+True++A few examples of control characters:++>>> all (inGroup Control) [Null,Substitute,UnitSeparator,Delete]+True++There are 33 control codes.++>>> length (filter (inGroup Control) allCharacters)+33++There are 95 printable characters.++>>> length (filter (inGroup Printable) allCharacters)+95++-}
+ test/test.hs view
@@ -0,0 +1,57 @@+module Main where++import ASCII.Group++import ASCII.Char (Char (..), allCharacters)++import Control.Applicative (Applicative (..))+import Control.Monad (Monad (..))+import Data.Bool (Bool (..), not)+import Data.Eq (Eq ((==)))+import Data.Foldable (all)+import Data.Function ((.), ($))+import Data.Functor (Functor (..))+import Data.List (intercalate, map, null, length, filter)+import Data.Semigroup ((<>))+import Numeric.Natural (Natural)+import System.Exit (die)+import System.IO (IO, putStrLn)+import Text.Show (show)++main :: IO ()+main = dieIfFailures $ do+ test 1 $ map charGroup [CapitalLetterA, EndOfTransmission] == [Printable, Control]+ test 2 $ not $ inGroup Printable EndOfTransmission+ test 3 $ inGroup Control EndOfTransmission+ test 4 $ charGroup Space == Printable+ test 5 $ charGroup HorizontalTab == Control+ test 6 $ all (inGroup Printable) [CapitalLetterA, SmallLetterZ, Digit4, Tilde]+ test 7 $ all (inGroup Control) [Null, Substitute, UnitSeparator, Delete]+ test 8 $ length (filter (inGroup Control) allCharacters) == 33+ test 9 $ length (filter (inGroup Printable) allCharacters) == 95++dieIfFailures :: Failures a -> IO a+dieIfFailures (Failures fs x) =+ if null fs+ then do putStrLn "💯"; return x+ else die $ intercalate " " (map (("🔥" <> ) . show) fs)++type TestNumber = Natural++test :: TestNumber -> Bool -> Failures ()+test n t = Failures (if t then [] else [n]) ()++data Failures a = Failures [TestNumber] a++instance Functor Failures+ where+ fmap f (Failures a x) = Failures a (f x)++instance Applicative Failures+ where+ pure x = Failures [] x+ Failures a f <*> Failures b x = Failures (a <> b) (f x)++instance Monad Failures+ where+ Failures a x >>= f = let Failures b y = f x in Failures (a <> b) y