git.iko.soy/rowtype-yoga/purescript-uuid
on main help sign in
Add parseUUID
commit46a44b52dba309a6d52f8a2f7b7c55fca7e5e211 authorMichael Trotter <spicydonuts@gmail.com> dateSun 31 Jan 2016, 16:20 (11 years ago) parente0a7983
5 files changed+62−11
docs/Data/UUID.md+16−1 package.json+2−1 src/Data/UUID.js+9−3 src/Data/UUID.purs+21−4 test/Main.purs+14−2
docs/Data/UUID.md+16−1
@@ -6,9 +6,14 @@
66newtype UUID
77```
88
9+Represents a UUID String.
10+Most UUID instances defer to String
11+
912##### Instances
1013``` purescript
1114Show UUID
15+Eq UUID
16+Ord UUID
1217```
1318
1419#### `GENUUID`
@@ -17,12 +22,22 @@ Show UUID
1722data GENUUID :: !
1823```
1924
25+The effect of generating a new UUID.
26+
2027#### `genUUID`
2128
2229``` purescript
2330genUUID :: forall e. Eff (uuid :: GENUUID | e) UUID
2431```
2532
26−Generates a v4 UUID with default options.
33+Generates a v4 UUID
34+
35+#### `parseUUID`
36+
37+``` purescript
38+parseUUID :: forall e. String -> Maybe UUID
39+```
40+
41+Validates a String as a v4 UUID
2742
2843
package.json+2−1
@@ -16,7 +16,8 @@
1616 "author": "",
1717 "license": "ISC",
1818 "dependencies": {
19− "uuid": "^2.0.1"
19+ "uuid": "^2.0.1",
20+ "uuid-validate": "0.0.2"
2021 },
2122 "devDependencies": {
2223 "eslint": "^1.10.3",
src/Data/UUID.js+9−3
@@ -2,8 +2,14 @@
22
33// module Data.UUID
44
5−var uuid = require('uuid');
6−
5+var mkV4UUID = null;
76exports.getUUIDImpl = function () {
8− return uuid.v4();
7+ if (mkV4UUID === null) mkV4UUID = require('uuid').v4;
8+ return mkV4UUID();
9+};
10+
11+var validateV4UUID = null;
12+exports.validateV4UUID = function (str) {
13+ if (validateV4UUID === null) validateV4UUID = require('uuid-validate');
14+ return validateV4UUID(str, 4);
915};
src/Data/UUID.purs+21−4
@@ -2,22 +2,39 @@ module Data.UUID
22 ( UUID()
33 , GENUUID()
44 , genUUID
5+ , parseUUID
56 ) where
67
78import Prelude
89import Control.Monad.Eff
10+import Data.Maybe
911
12+-- | Represents a UUID String.
13+-- | Most UUID instances defer to String
1014newtype UUID = UUID String
1115
16+-- | The effect of generating a new UUID.
1217foreign import data GENUUID :: !
1318
1419foreign import getUUIDImpl :: forall e. Eff (uuid :: GENUUID | e) String
1520
16−-- | Generates a v4 UUID with default options.
21+-- | Generates a v4 UUID
1722genUUID :: forall e. Eff (uuid :: GENUUID | e) UUID
18−genUUID = do
19− uuidStr <- getUUIDImpl
20− pure $ UUID uuidStr
23+genUUID = getUUIDImpl >>= pure <<< UUID
24+
25+foreign import validateV4UUID :: String -> Boolean
26+
27+-- | Validates a String as a v4 UUID
28+parseUUID :: forall e. String -> Maybe UUID
29+parseUUID str = case validateV4UUID str of
30+ true -> Just $ UUID str
31+ _ -> Nothing
2132
2233instance showUUID :: Show UUID where
2334 show (UUID uuid) = uuid
35+
36+instance eqUUID :: Eq UUID where
37+ eq (UUID uA) (UUID uB) = uA == uB
38+
39+instance ordUUID :: Ord UUID where
40+ compare (UUID uA) (UUID uB) = compare uA uB
test/Main.purs+14−2
@@ -6,6 +6,8 @@ import Control.Monad.Eff.Console
66
77import Control.Monad.Aff
88
9+import Data.Maybe
10+import Data.Maybe.Unsafe
911import Data.String
1012import Data.UUID
1113
@@ -16,7 +18,17 @@ import Test.Spec.Reporter.Console
1618
1719main :: forall e. Eff (uuid :: GENUUID, console :: CONSOLE, process :: Process | e) Unit
1820main = run [consoleReporter] do
19− describe "genUUID :: Eff _ UUID" do
20− it "returns a uuid" do
21+ describe "Data.UUID" do
22+ it "`genUUID` returns a uuid" do
2123 uuid <- liftEff' genUUID
2224 (length <<< show) uuid `shouldEqual` 44
25+
26+ it "`parseUUID` parses a valid uuid as Just UUID" do
27+ let uuidStr = "d0778cf2-3a4c-42ef-acbd-1269b6bec204"
28+ uuid = parseUUID uuidStr
29+ uuidStr `shouldEqual` (show $ fromJust uuid)
30+
31+ it "`parseUUID` parses an invalid uuid as Nothing" do
32+ let uuidStr = "foo"
33+ uuid = parseUUID uuidStr
34+ Nothing `shouldEqual` uuid