NanoID 1.2.0 → 2.0.0
raw patch · 4 files changed
+43/−19 lines, 4 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ Data.NanoID: alphanumeric :: Alphabet
+ Data.NanoID: hexadecimalLowercase :: Alphabet
+ Data.NanoID: hexadecimalUppercase :: Alphabet
+ Data.NanoID: lowercase :: Alphabet
+ Data.NanoID: nolookalikes :: Alphabet
+ Data.NanoID: nolookalikesSafe :: Alphabet
+ Data.NanoID: numbers :: Alphabet
+ Data.NanoID: uppercase :: Alphabet
- Data.NanoID: customNanoID :: Alphabet -> Length -> GenIO -> IO (Either String NanoID)
+ Data.NanoID: customNanoID :: Alphabet -> Maybe Length -> GenIO -> IO (Either String NanoID)
Files
- NanoID.cabal +4/−4
- ReadMe.md +1/−1
- app/Main.hs +3/−3
- src/Data/NanoID.hs +35/−11
NanoID.cabal view
@@ -1,5 +1,5 @@ name: NanoID-version: 1.2.0+version: 2.0.0 synopsis: NanoID generator description: Library and CLI tool for NanoID generation license: BSD3@@ -20,9 +20,9 @@ library exposed-modules: Data.NanoID- build-depends: base >= 4.7 && < 4.16+ build-depends: base >= 4.7 && < 4.16 , bytestring >= 0.10 && < 0.12- , extra >= 1.6 && < 1.8+ , extra >= 1.6 && < 1.8 , mwc-random >= 0.13 && < 0.16 hs-source-dirs: src default-language: Haskell2010@@ -30,7 +30,7 @@ executable nanoid main-is: Main.hs other-modules: Options- build-depends: base >= 4.7 && < 4.16+ build-depends: base >= 4.7 && < 4.16 , bytestring >= 0.10 && < 0.12 , mwc-random >= 0.13 && < 0.16 , NanoID
ReadMe.md view
@@ -2,7 +2,7 @@ ``` [user@box ~] $ nanoid -h-nanoid v1.0.1, (c) Michel Boucey 2021+nanoid v2.0.0, (c) Michel Boucey 2021 Usage: nanoid [-a|--alphabet ARG] [-l|--length ARG] [-q|--quantity ARG] [-n|--newline]
app/Main.hs view
@@ -13,12 +13,12 @@ main :: IO () main = do Options{..} <- execParser opts- if length > 21- then putStrLn "The length of NanoID is less or equal to 21" >> exitFailure+ if length < 1 + then putStrLn "Strange (nano)idea... less than one char" >> exitFailure else do let alphabet' = Alphabet { unAlphabet = C.pack alphabet } replicateM_ quantity $- createSystemRandom >>= customNanoID alphabet' length >>= putNanoID newline+ createSystemRandom >>= customNanoID alphabet' (Just length) >>= putNanoID newline exitSuccess where putNanoID nl = either (put nl . C.pack) (put nl . unNanoID)
src/Data/NanoID.hs view
@@ -2,6 +2,7 @@ import Control.Monad import qualified Data.ByteString.Char8 as C+import Data.Maybe import System.Random.MWC newtype NanoID = NanoID { unNanoID :: C.ByteString } deriving (Eq, Show)@@ -10,18 +11,41 @@ type Length = Int -defaultAlphabet :: Alphabet-defaultAlphabet = Alphabet (C.pack "ABCDEFGHIJKLMNOPKRSTUVWXYZ_-abcdefghijklmnopqrstuvwxyz")- nanoID :: IO (Either String NanoID)-nanoID = createSystemRandom >>= customNanoID defaultAlphabet 21+nanoID = createSystemRandom >>= customNanoID defaultAlphabet Nothing -customNanoID :: Alphabet -> Length -> GenIO-> IO (Either String NanoID)+customNanoID :: Alphabet -> Maybe Length -> GenIO-> IO (Either String NanoID) customNanoID a l g =- if l > 21- then return (Left "The length of NanoID is less or equal to 21")- else do- let acs = unAlphabet a- al = C.length acs- pure . NanoID . C.pack <$> replicateM l ((\r -> C.index acs (r-1)) <$> uniformR (1,al) g)+ let ua = unAlphabet a+ al = C.length ua in+ pure . NanoID . C.pack <$> replicateM (fromMaybe 21 l) ((\r -> C.index ua (r-1)) <$> uniformR (1,al) g)++-- | The default 'Alphabet', made of URL-friendly symbols.+defaultAlphabet :: Alphabet+defaultAlphabet = Alphabet (C.pack "ABCDEFGHIJKLMNOPKRSTUVWXYZ_1234567890-abcdefghijklmnopqrstuvwxyz")++-- | Predefined 'Alphabet's borrowed from <https://github.com/CyberAP/nanoid-dictionary>+numbers :: Alphabet+numbers = Alphabet (C.pack "1234567890")++hexadecimalLowercase :: Alphabet+hexadecimalLowercase = Alphabet (C.pack "0123456789abcdef")++hexadecimalUppercase :: Alphabet+hexadecimalUppercase = Alphabet (C.pack "0123456789ABCDEF")++lowercase :: Alphabet+lowercase = Alphabet (C.pack "abcdefghijklmnopqrstuvwxyz")++uppercase :: Alphabet+uppercase = Alphabet (C.pack "ABCDEFGHIJKLMNOPQRSTUVWXYZ")++alphanumeric :: Alphabet+alphanumeric = Alphabet (C.pack "ABCDEFGHIJKLMNOPKRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyz")++nolookalikes :: Alphabet+nolookalikes = Alphabet (C.pack "346789ABCDEFGHJKLMNPQRTUVWXYabcdefghijkmnpqrtwxyz")++nolookalikesSafe :: Alphabet+nolookalikesSafe = Alphabet (C.pack "6789ABCDEFGHJKLMNPQRTUWYabcdefghijkmnpqrtwyz")