on master help sign in
21 files changed+368−385
since splitsnapshots
unifiedsplit
.github/workflows/haskell-ci-bench.yml+107−43 .github/workflows/haskell-ci.yml+117−51 cabal.haskell-ci+6 cabal.project+1−1 haskell-ci.sh → gen-ci.sh uuid-bench/bench/uuid-benchmark.hs−1 uuid-bench/uuid-bench.cabal+27−20 uuid-types/ChangeLog.md+9 uuid-types/src/Data/UUID/Types.hs−4 uuid-types/src/Data/UUID/Types/Internal.hs+15−43 uuid-types/src/Data/UUID/Types/Internal/Builder.hs−3 uuid-types/tests/TestUUID.hs+7 uuid-types/uuid-types.cabal+28−21 uuid/CHANGES.md+15−1 uuid/src/Data/UUID.hs+2−3 uuid/src/Data/UUID/Util.hs−11 uuid/src/Data/UUID/V1.hs−135 uuid/src/Data/UUID/V3.hs+1−1 uuid/src/Data/UUID/V4.hs+5−4 uuid/tests/TestUUID.hs+4−20 uuid/uuid.cabal+24−23
.github/workflows/haskell-ci-bench.yml+107−43
@@ -8,9 +8,9 @@
88#
99# For more information, see https://github.com/haskell-CI/haskell-ci
1010#
11−# version: 0.11.20210214
11+# version: 0.19.20240702
1212#
13−# REGENDATA ("0.11.20210214",["github","--project","cabal.bench.project","-o",".github/workflows/haskell-ci-bench.yml","--github-action-name","Benchmarks"])
13+# REGENDATA ("0.19.20240702",["github","--project","cabal.bench.project","-o",".github/workflows/haskell-ci-bench.yml","--github-action-name","Benchmarks"])
1414#
1515name: Benchmarks
1616on:
@@ -22,57 +22,101 @@ on:
2222 - master
2323jobs:
2424 linux:
25− name: Benchmarks - Linux - GHC ${{ matrix.ghc }}
26− runs-on: ubuntu-18.04
25+ name: Benchmarks - Linux - ${{ matrix.compiler }}
26+ runs-on: ubuntu-20.04
27+ timeout-minutes:
28+ 60
2729 container:
28− image: buildpack-deps:bionic
30+ image: buildpack-deps:jammy
2931 continue-on-error: ${{ matrix.allow-failure }}
3032 strategy:
3133 matrix:
3234 include:
33− - ghc: 8.10.3
35+ - compiler: ghc-9.10.1
36+ compilerKind: ghc
37+ compilerVersion: 9.10.1
38+ setup-method: ghcup
3439 allow-failure: false
35− - ghc: 8.8.4
40+ - compiler: ghc-9.8.2
41+ compilerKind: ghc
42+ compilerVersion: 9.8.2
43+ setup-method: ghcup
3644 allow-failure: false
37− - ghc: 8.6.4
45+ - compiler: ghc-9.6.6
46+ compilerKind: ghc
47+ compilerVersion: 9.6.6
48+ setup-method: ghcup
3849 allow-failure: false
39− - ghc: 8.4.4
50+ - compiler: ghc-9.4.8
51+ compilerKind: ghc
52+ compilerVersion: 9.4.8
53+ setup-method: ghcup
4054 allow-failure: false
41− - ghc: 8.2.2
55+ - compiler: ghc-9.2.8
56+ compilerKind: ghc
57+ compilerVersion: 9.2.8
58+ setup-method: ghcup
4259 allow-failure: false
43− - ghc: 8.0.2
60+ - compiler: ghc-9.0.2
61+ compilerKind: ghc
62+ compilerVersion: 9.0.2
63+ setup-method: ghcup
64+ allow-failure: false
65+ - compiler: ghc-8.10.7
66+ compilerKind: ghc
67+ compilerVersion: 8.10.7
68+ setup-method: ghcup
69+ allow-failure: false
70+ - compiler: ghc-8.8.4
71+ compilerKind: ghc
72+ compilerVersion: 8.8.4
73+ setup-method: ghcup
74+ allow-failure: false
75+ - compiler: ghc-8.6.5
76+ compilerKind: ghc
77+ compilerVersion: 8.6.5
78+ setup-method: ghcup
4479 allow-failure: false
4580 fail-fast: false
4681 steps:
4782 - name: apt
4883 run: |
4984 apt-get update
50− apt-get install -y --no-install-recommends gnupg ca-certificates dirmngr curl git software-properties-common
51− apt-add-repository -y 'ppa:hvr/ghc'
52− apt-get update
53− apt-get install -y ghc-$GHC_VERSION cabal-install-3.2
85+ apt-get install -y --no-install-recommends gnupg ca-certificates dirmngr curl git software-properties-common libtinfo5
86+ mkdir -p "$HOME/.ghcup/bin"
87+ curl -sL https://downloads.haskell.org/ghcup/0.1.20.0/x86_64-linux-ghcup-0.1.20.0 > "$HOME/.ghcup/bin/ghcup"
88+ chmod a+x "$HOME/.ghcup/bin/ghcup"
89+ "$HOME/.ghcup/bin/ghcup" install ghc "$HCVER" || (cat "$HOME"/.ghcup/logs/*.* && false)
90+ "$HOME/.ghcup/bin/ghcup" install cabal 3.12.1.0 || (cat "$HOME"/.ghcup/logs/*.* && false)
5491 env:
55− GHC_VERSION: ${{ matrix.ghc }}
92+ HCKIND: ${{ matrix.compilerKind }}
93+ HCNAME: ${{ matrix.compiler }}
94+ HCVER: ${{ matrix.compilerVersion }}
5695 - name: Set PATH and environment variables
5796 run: |
5897 echo "$HOME/.cabal/bin" >> $GITHUB_PATH
59− echo "LANG=C.UTF-8" >> $GITHUB_ENV
60− echo "CABAL_DIR=$HOME/.cabal" >> $GITHUB_ENV
61− echo "CABAL_CONFIG=$HOME/.cabal/config" >> $GITHUB_ENV
62− HC=/opt/ghc/$GHC_VERSION/bin/ghc
63− echo "HC=$HC" >> $GITHUB_ENV
64− echo "HCPKG=/opt/ghc/$GHC_VERSION/bin/ghc-pkg" >> $GITHUB_ENV
65− echo "HADDOCK=/opt/ghc/$GHC_VERSION/bin/haddock" >> $GITHUB_ENV
66− echo "CABAL=/opt/cabal/3.2/bin/cabal -vnormal+nowrap" >> $GITHUB_ENV
98+ echo "LANG=C.UTF-8" >> "$GITHUB_ENV"
99+ echo "CABAL_DIR=$HOME/.cabal" >> "$GITHUB_ENV"
100+ echo "CABAL_CONFIG=$HOME/.cabal/config" >> "$GITHUB_ENV"
101+ HCDIR=/opt/$HCKIND/$HCVER
102+ HC=$("$HOME/.ghcup/bin/ghcup" whereis ghc "$HCVER")
103+ HCPKG=$(echo "$HC" | sed 's#ghc$#ghc-pkg#')
104+ HADDOCK=$(echo "$HC" | sed 's#ghc$#haddock#')
105+ echo "HC=$HC" >> "$GITHUB_ENV"
106+ echo "HCPKG=$HCPKG" >> "$GITHUB_ENV"
107+ echo "HADDOCK=$HADDOCK" >> "$GITHUB_ENV"
108+ echo "CABAL=$HOME/.ghcup/bin/cabal-3.12.1.0 -vnormal+nowrap" >> "$GITHUB_ENV"
67109 HCNUMVER=$(${HC} --numeric-version|perl -ne '/^(\d+)\.(\d+)\.(\d+)(\.(\d+))?$/; print(10000 * $1 + 100 * $2 + ($3 == 0 ? $5 != 1 : $3))')
68− echo "HCNUMVER=$HCNUMVER" >> $GITHUB_ENV
69− echo "ARG_TESTS=--enable-tests" >> $GITHUB_ENV
70− echo "ARG_BENCH=--enable-benchmarks" >> $GITHUB_ENV
71− echo "HEADHACKAGE=false" >> $GITHUB_ENV
72− echo "ARG_COMPILER=--ghc --with-compiler=/opt/ghc/$GHC_VERSION/bin/ghc" >> $GITHUB_ENV
73− echo "GHCJSARITH=0" >> $GITHUB_ENV
110+ echo "HCNUMVER=$HCNUMVER" >> "$GITHUB_ENV"
111+ echo "ARG_TESTS=--enable-tests" >> "$GITHUB_ENV"
112+ echo "ARG_BENCH=--enable-benchmarks" >> "$GITHUB_ENV"
113+ echo "HEADHACKAGE=false" >> "$GITHUB_ENV"
114+ echo "ARG_COMPILER=--$HCKIND --with-compiler=$HC" >> "$GITHUB_ENV"
115+ echo "GHCJSARITH=0" >> "$GITHUB_ENV"
74116 env:
75− GHC_VERSION: ${{ matrix.ghc }}
117+ HCKIND: ${{ matrix.compilerKind }}
118+ HCNAME: ${{ matrix.compiler }}
119+ HCVER: ${{ matrix.compilerVersion }}
76120 - name: env
77121 run: |
78122 env
@@ -95,6 +139,10 @@ jobs:
95139 repository hackage.haskell.org
96140 url: http://hackage.haskell.org/
97141 EOF
142+ cat >> $CABAL_CONFIG <<EOF
143+ program-default-options
144+ ghc-options: $GHCJOBS +RTS -M3G -RTS
145+ EOF
98146 cat $CABAL_CONFIG
99147 - name: versions
100148 run: |
@@ -107,14 +155,14 @@ jobs:
107155 - name: install cabal-plan
108156 run: |
109157 mkdir -p $HOME/.cabal/bin
110− curl -sL https://github.com/haskell-hvr/cabal-plan/releases/download/v0.6.2.0/cabal-plan-0.6.2.0-x86_64-linux.xz > cabal-plan.xz
111− echo 'de73600b1836d3f55e32d80385acc055fd97f60eaa0ab68a755302685f5d81bc cabal-plan.xz' | sha256sum -c -
158+ curl -sL https://github.com/haskell-hvr/cabal-plan/releases/download/v0.7.3.0/cabal-plan-0.7.3.0-x86_64-linux.xz > cabal-plan.xz
159+ echo 'f62ccb2971567a5f638f2005ad3173dba14693a45154c1508645c52289714cb2 cabal-plan.xz' | sha256sum -c -
112160 xz -d < cabal-plan.xz > $HOME/.cabal/bin/cabal-plan
113161 rm -f cabal-plan.xz
114162 chmod a+x $HOME/.cabal/bin/cabal-plan
115163 cabal-plan --version
116164 - name: checkout
117− uses: actions/checkout@v2
165+ uses: actions/checkout@v4
118166 with:
119167 path: source
120168 - name: initial cabal.project for sdist
@@ -133,27 +181,28 @@ jobs:
133181 - name: generate cabal.project
134182 run: |
135183 PKGDIR_uuid_bench="$(find "$GITHUB_WORKSPACE/unpacked" -maxdepth 1 -type d -regex '.*/uuid-bench-[0-9.]*')"
136− echo "PKGDIR_uuid_bench=${PKGDIR_uuid_bench}" >> $GITHUB_ENV
184+ echo "PKGDIR_uuid_bench=${PKGDIR_uuid_bench}" >> "$GITHUB_ENV"
185+ rm -f cabal.project cabal.project.local
137186 touch cabal.project
138187 touch cabal.project.local
139188 echo "packages: ${PKGDIR_uuid_bench}" >> cabal.project
140− if [ $((HCNUMVER >= 80200)) -ne 0 ] ; then echo "package uuid-bench" >> cabal.project ; fi
141− if [ $((HCNUMVER >= 80200)) -ne 0 ] ; then echo " ghc-options: -Werror=missing-methods" >> cabal.project ; fi
189+ echo "package uuid-bench" >> cabal.project
190+ echo " ghc-options: -Werror=missing-methods" >> cabal.project
142191 cat >> cabal.project <<EOF
143192 EOF
144− $HCPKG list --simple-output --names-only | perl -ne 'for (split /\s+/) { print "constraints: $_ installed\n" unless /^(uuid-bench)$/; }' >> cabal.project.local
193+ $HCPKG list --simple-output --names-only | perl -ne 'for (split /\s+/) { print "constraints: any.$_ installed\n" unless /^(uuid-bench)$/; }' >> cabal.project.local
145194 cat cabal.project
146195 cat cabal.project.local
147196 - name: dump install plan
148197 run: |
149198 $CABAL v2-build $ARG_COMPILER $ARG_TESTS $ARG_BENCH --dry-run all
150199 cabal-plan
151− - name: cache
152− uses: actions/cache@v2
200+ - name: restore cache
201+ uses: actions/cache/restore@v4
153202 with:
154− key: ${{ runner.os }}-${{ matrix.ghc }}-${{ github.sha }}
203+ key: ${{ runner.os }}-${{ matrix.compiler }}-${{ github.sha }}
155204 path: ~/.cabal/store
156− restore-keys: ${{ runner.os }}-${{ matrix.ghc }}-
205+ restore-keys: ${{ runner.os }}-${{ matrix.compiler }}-
157206 - name: install dependencies
158207 run: |
159208 $CABAL v2-build $ARG_COMPILER --disable-tests --disable-benchmarks --dependencies-only -j2 all
@@ -170,8 +219,23 @@ jobs:
170219 ${CABAL} -vnormal check
171220 - name: haddock
172221 run: |
173− $CABAL v2-haddock $ARG_COMPILER --with-haddock $HADDOCK $ARG_TESTS $ARG_BENCH all
222+ $CABAL v2-haddock --disable-documentation --haddock-all $ARG_COMPILER --with-haddock $HADDOCK $ARG_TESTS $ARG_BENCH all
174223 - name: unconstrained build
175224 run: |
176225 rm -f cabal.project.local
177226 $CABAL v2-build $ARG_COMPILER --disable-tests --disable-benchmarks all
227+ - name: prepare for constraint sets
228+ run: |
229+ rm -f cabal.project.local
230+ - name: constraint set random-1.2
231+ run: |
232+ $CABAL v2-build $ARG_COMPILER --disable-tests --disable-benchmarks --constraint='random==1.2.*' all --dry-run
233+ cabal-plan topo | sort
234+ $CABAL v2-build $ARG_COMPILER --disable-tests --disable-benchmarks --constraint='random==1.2.*' --dependencies-only -j2 all
235+ $CABAL v2-build $ARG_COMPILER --disable-tests --disable-benchmarks --constraint='random==1.2.*' all
236+ - name: save cache
237+ uses: actions/cache/save@v4
238+ if: always()
239+ with:
240+ key: ${{ runner.os }}-${{ matrix.compiler }}-${{ github.sha }}
241+ path: ~/.cabal/store
.github/workflows/haskell-ci.yml+117−51
@@ -8,9 +8,9 @@
88#
99# For more information, see https://github.com/haskell-CI/haskell-ci
1010#
11−# version: 0.11.20210214
11+# version: 0.19.20241223
1212#
13−# REGENDATA ("0.11.20210214",["github","cabal.project"])
13+# REGENDATA ("0.19.20241223",["github","cabal.project"])
1414#
1515name: Haskell-CI
1616on:
@@ -22,65 +22,111 @@ on:
2222 - master
2323jobs:
2424 linux:
25− name: Haskell-CI - Linux - GHC ${{ matrix.ghc }}
26− runs-on: ubuntu-18.04
25+ name: Haskell-CI - Linux - ${{ matrix.compiler }}
26+ runs-on: ubuntu-20.04
27+ timeout-minutes:
28+ 60
2729 container:
28− image: buildpack-deps:bionic
30+ image: buildpack-deps:jammy
2931 continue-on-error: ${{ matrix.allow-failure }}
3032 strategy:
3133 matrix:
3234 include:
33− - ghc: 8.10.3
35+ - compiler: ghc-9.12.1
36+ compilerKind: ghc
37+ compilerVersion: 9.12.1
38+ setup-method: ghcup
3439 allow-failure: false
35− - ghc: 8.8.4
40+ - compiler: ghc-9.10.1
41+ compilerKind: ghc
42+ compilerVersion: 9.10.1
43+ setup-method: ghcup
3644 allow-failure: false
37− - ghc: 8.6.4
45+ - compiler: ghc-9.8.4
46+ compilerKind: ghc
47+ compilerVersion: 9.8.4
48+ setup-method: ghcup
3849 allow-failure: false
39− - ghc: 8.4.4
50+ - compiler: ghc-9.6.6
51+ compilerKind: ghc
52+ compilerVersion: 9.6.6
53+ setup-method: ghcup
4054 allow-failure: false
41− - ghc: 8.2.2
55+ - compiler: ghc-9.4.8
56+ compilerKind: ghc
57+ compilerVersion: 9.4.8
58+ setup-method: ghcup
4259 allow-failure: false
43− - ghc: 8.0.2
60+ - compiler: ghc-9.2.8
61+ compilerKind: ghc
62+ compilerVersion: 9.2.8
63+ setup-method: ghcup
4464 allow-failure: false
45− - ghc: 7.10.3
65+ - compiler: ghc-9.0.2
66+ compilerKind: ghc
67+ compilerVersion: 9.0.2
68+ setup-method: ghcup
4669 allow-failure: false
47− - ghc: 7.8.4
70+ - compiler: ghc-8.10.7
71+ compilerKind: ghc
72+ compilerVersion: 8.10.7
73+ setup-method: ghcup
4874 allow-failure: false
49− - ghc: 7.6.3
75+ - compiler: ghc-8.8.4
76+ compilerKind: ghc
77+ compilerVersion: 8.8.4
78+ setup-method: ghcup
5079 allow-failure: false
51− - ghc: 7.4.2
80+ - compiler: ghc-8.6.5
81+ compilerKind: ghc
82+ compilerVersion: 8.6.5
83+ setup-method: ghcup
5284 allow-failure: false
5385 fail-fast: false
5486 steps:
55− - name: apt
87+ - name: apt-get install
5688 run: |
5789 apt-get update
58− apt-get install -y --no-install-recommends gnupg ca-certificates dirmngr curl git software-properties-common
59− apt-add-repository -y 'ppa:hvr/ghc'
60− apt-get update
61− apt-get install -y ghc-$GHC_VERSION cabal-install-3.2
90+ apt-get install -y --no-install-recommends gnupg ca-certificates dirmngr curl git software-properties-common libtinfo5
91+ - name: Install GHCup
92+ run: |
93+ mkdir -p "$HOME/.ghcup/bin"
94+ curl -sL https://downloads.haskell.org/ghcup/0.1.30.0/x86_64-linux-ghcup-0.1.30.0 > "$HOME/.ghcup/bin/ghcup"
95+ chmod a+x "$HOME/.ghcup/bin/ghcup"
96+ - name: Install cabal-install
97+ run: |
98+ "$HOME/.ghcup/bin/ghcup" install cabal 3.14.1.0 || (cat "$HOME"/.ghcup/logs/*.* && false)
99+ echo "CABAL=$HOME/.ghcup/bin/cabal-3.14.1.0 -vnormal+nowrap" >> "$GITHUB_ENV"
100+ - name: Install GHC (GHCup)
101+ if: matrix.setup-method == 'ghcup'
102+ run: |
103+ "$HOME/.ghcup/bin/ghcup" install ghc "$HCVER" || (cat "$HOME"/.ghcup/logs/*.* && false)
104+ HC=$("$HOME/.ghcup/bin/ghcup" whereis ghc "$HCVER")
105+ HCPKG=$(echo "$HC" | sed 's#ghc$#ghc-pkg#')
106+ HADDOCK=$(echo "$HC" | sed 's#ghc$#haddock#')
107+ echo "HC=$HC" >> "$GITHUB_ENV"
108+ echo "HCPKG=$HCPKG" >> "$GITHUB_ENV"
109+ echo "HADDOCK=$HADDOCK" >> "$GITHUB_ENV"
62110 env:
63− GHC_VERSION: ${{ matrix.ghc }}
111+ HCKIND: ${{ matrix.compilerKind }}
112+ HCNAME: ${{ matrix.compiler }}
113+ HCVER: ${{ matrix.compilerVersion }}
64114 - name: Set PATH and environment variables
65115 run: |
66116 echo "$HOME/.cabal/bin" >> $GITHUB_PATH
67− echo "LANG=C.UTF-8" >> $GITHUB_ENV
68− echo "CABAL_DIR=$HOME/.cabal" >> $GITHUB_ENV
69− echo "CABAL_CONFIG=$HOME/.cabal/config" >> $GITHUB_ENV
70− HC=/opt/ghc/$GHC_VERSION/bin/ghc
71− echo "HC=$HC" >> $GITHUB_ENV
72− echo "HCPKG=/opt/ghc/$GHC_VERSION/bin/ghc-pkg" >> $GITHUB_ENV
73− echo "HADDOCK=/opt/ghc/$GHC_VERSION/bin/haddock" >> $GITHUB_ENV
74− echo "CABAL=/opt/cabal/3.2/bin/cabal -vnormal+nowrap" >> $GITHUB_ENV
117+ echo "LANG=C.UTF-8" >> "$GITHUB_ENV"
118+ echo "CABAL_DIR=$HOME/.cabal" >> "$GITHUB_ENV"
119+ echo "CABAL_CONFIG=$HOME/.cabal/config" >> "$GITHUB_ENV"
75120 HCNUMVER=$(${HC} --numeric-version|perl -ne '/^(\d+)\.(\d+)\.(\d+)(\.(\d+))?$/; print(10000 * $1 + 100 * $2 + ($3 == 0 ? $5 != 1 : $3))')
76− echo "HCNUMVER=$HCNUMVER" >> $GITHUB_ENV
77− echo "ARG_TESTS=--enable-tests" >> $GITHUB_ENV
78− echo "ARG_BENCH=--enable-benchmarks" >> $GITHUB_ENV
79− echo "HEADHACKAGE=false" >> $GITHUB_ENV
80− echo "ARG_COMPILER=--ghc --with-compiler=/opt/ghc/$GHC_VERSION/bin/ghc" >> $GITHUB_ENV
81− echo "GHCJSARITH=0" >> $GITHUB_ENV
121+ echo "HCNUMVER=$HCNUMVER" >> "$GITHUB_ENV"
122+ echo "ARG_TESTS=--enable-tests" >> "$GITHUB_ENV"
123+ echo "ARG_BENCH=--enable-benchmarks" >> "$GITHUB_ENV"
124+ echo "HEADHACKAGE=false" >> "$GITHUB_ENV"
125+ echo "ARG_COMPILER=--$HCKIND --with-compiler=$HC" >> "$GITHUB_ENV"
82126 env:
83− GHC_VERSION: ${{ matrix.ghc }}
127+ HCKIND: ${{ matrix.compilerKind }}
128+ HCNAME: ${{ matrix.compiler }}
129+ HCVER: ${{ matrix.compilerVersion }}
84130 - name: env
85131 run: |
86132 env
@@ -103,6 +149,10 @@ jobs:
103149 repository hackage.haskell.org
104150 url: http://hackage.haskell.org/
105151 EOF
152+ cat >> $CABAL_CONFIG <<EOF
153+ program-default-options
154+ ghc-options: $GHCJOBS +RTS -M3G -RTS
155+ EOF
106156 cat $CABAL_CONFIG
107157 - name: versions
108158 run: |
@@ -115,14 +165,14 @@ jobs:
115165 - name: install cabal-plan
116166 run: |
117167 mkdir -p $HOME/.cabal/bin
118− curl -sL https://github.com/haskell-hvr/cabal-plan/releases/download/v0.6.2.0/cabal-plan-0.6.2.0-x86_64-linux.xz > cabal-plan.xz
119− echo 'de73600b1836d3f55e32d80385acc055fd97f60eaa0ab68a755302685f5d81bc cabal-plan.xz' | sha256sum -c -
168+ curl -sL https://github.com/haskell-hvr/cabal-plan/releases/download/v0.7.3.0/cabal-plan-0.7.3.0-x86_64-linux.xz > cabal-plan.xz
169+ echo 'f62ccb2971567a5f638f2005ad3173dba14693a45154c1508645c52289714cb2 cabal-plan.xz' | sha256sum -c -
120170 xz -d < cabal-plan.xz > $HOME/.cabal/bin/cabal-plan
121171 rm -f cabal-plan.xz
122172 chmod a+x $HOME/.cabal/bin/cabal-plan
123173 cabal-plan --version
124174 - name: checkout
125− uses: actions/checkout@v2
175+ uses: actions/checkout@v4
126176 with:
127177 path: source
128178 - name: initial cabal.project for sdist
@@ -142,32 +192,33 @@ jobs:
142192 - name: generate cabal.project
143193 run: |
144194 PKGDIR_uuid_types="$(find "$GITHUB_WORKSPACE/unpacked" -maxdepth 1 -type d -regex '.*/uuid-types-[0-9.]*')"
145− echo "PKGDIR_uuid_types=${PKGDIR_uuid_types}" >> $GITHUB_ENV
195+ echo "PKGDIR_uuid_types=${PKGDIR_uuid_types}" >> "$GITHUB_ENV"
146196 PKGDIR_uuid="$(find "$GITHUB_WORKSPACE/unpacked" -maxdepth 1 -type d -regex '.*/uuid-[0-9.]*')"
147− echo "PKGDIR_uuid=${PKGDIR_uuid}" >> $GITHUB_ENV
197+ echo "PKGDIR_uuid=${PKGDIR_uuid}" >> "$GITHUB_ENV"
198+ rm -f cabal.project cabal.project.local
148199 touch cabal.project
149200 touch cabal.project.local
150201 echo "packages: ${PKGDIR_uuid_types}" >> cabal.project
151202 echo "packages: ${PKGDIR_uuid}" >> cabal.project
152− if [ $((HCNUMVER >= 80200)) -ne 0 ] ; then echo "package uuid-types" >> cabal.project ; fi
153− if [ $((HCNUMVER >= 80200)) -ne 0 ] ; then echo " ghc-options: -Werror=missing-methods" >> cabal.project ; fi
154− if [ $((HCNUMVER >= 80200)) -ne 0 ] ; then echo "package uuid" >> cabal.project ; fi
155− if [ $((HCNUMVER >= 80200)) -ne 0 ] ; then echo " ghc-options: -Werror=missing-methods" >> cabal.project ; fi
203+ echo "package uuid-types" >> cabal.project
204+ echo " ghc-options: -Werror=missing-methods" >> cabal.project
205+ echo "package uuid" >> cabal.project
206+ echo " ghc-options: -Werror=missing-methods" >> cabal.project
156207 cat >> cabal.project <<EOF
157208 EOF
158− $HCPKG list --simple-output --names-only | perl -ne 'for (split /\s+/) { print "constraints: $_ installed\n" unless /^(uuid|uuid-types)$/; }' >> cabal.project.local
209+ $HCPKG list --simple-output --names-only | perl -ne 'for (split /\s+/) { print "constraints: any.$_ installed\n" unless /^(uuid|uuid-types)$/; }' >> cabal.project.local
159210 cat cabal.project
160211 cat cabal.project.local
161212 - name: dump install plan
162213 run: |
163214 $CABAL v2-build $ARG_COMPILER $ARG_TESTS $ARG_BENCH --dry-run all
164215 cabal-plan
165− - name: cache
166− uses: actions/cache@v2
216+ - name: restore cache
217+ uses: actions/cache/restore@v4
167218 with:
168− key: ${{ runner.os }}-${{ matrix.ghc }}-${{ github.sha }}
219+ key: ${{ runner.os }}-${{ matrix.compiler }}-${{ github.sha }}
169220 path: ~/.cabal/store
170− restore-keys: ${{ runner.os }}-${{ matrix.ghc }}-
221+ restore-keys: ${{ runner.os }}-${{ matrix.compiler }}-
171222 - name: install dependencies
172223 run: |
173224 $CABAL v2-build $ARG_COMPILER --disable-tests --disable-benchmarks --dependencies-only -j2 all
@@ -189,8 +240,23 @@ jobs:
189240 ${CABAL} -vnormal check
190241 - name: haddock
191242 run: |
192− $CABAL v2-haddock $ARG_COMPILER --with-haddock $HADDOCK $ARG_TESTS $ARG_BENCH all
243+ $CABAL v2-haddock --disable-documentation --haddock-all $ARG_COMPILER --with-haddock $HADDOCK $ARG_TESTS $ARG_BENCH all
193244 - name: unconstrained build
194245 run: |
195246 rm -f cabal.project.local
196247 $CABAL v2-build $ARG_COMPILER --disable-tests --disable-benchmarks all
248+ - name: prepare for constraint sets
249+ run: |
250+ rm -f cabal.project.local
251+ - name: constraint set random-1.2
252+ run: |
253+ $CABAL v2-build $ARG_COMPILER --disable-tests --disable-benchmarks --constraint='random==1.2.*' all --dry-run
254+ cabal-plan topo | sort
255+ $CABAL v2-build $ARG_COMPILER --disable-tests --disable-benchmarks --constraint='random==1.2.*' --dependencies-only -j2 all
256+ $CABAL v2-build $ARG_COMPILER --disable-tests --disable-benchmarks --constraint='random==1.2.*' all
257+ - name: save cache
258+ if: always()
259+ uses: actions/cache/save@v4
260+ with:
261+ key: ${{ runner.os }}-${{ matrix.compiler }}-${{ github.sha }}
262+ path: ~/.cabal/store
cabal.haskell-ci+6
@@ -1 +1,7 @@
11branches: master
2+-- jobs-selection: any
3+head-hackage: False
4+
5+constraint-set random-1.2
6+ ghc: >=7.10
7+ constraints: random==1.2.*
cabal.project+1−1
@@ -2,7 +2,7 @@
22-- for more details
33
44packages: uuid-types/
5− uuid/
5+packages: uuid/
66
77package uuid-types
88 tests: True
haskell-ci.sh → gen-ci.shrenamed

The content is the same.

uuid-bench/bench/uuid-benchmark.hs−1
@@ -3,7 +3,6 @@ import Data.Char (ord)
33import Data.IORef
44import Data.Word
55import qualified Data.UUID as U
6−import qualified Data.UUID.V1 as U
76import qualified Data.UUID.V4 as U
87import qualified Data.UUID.V3 as U3
98import qualified Data.UUID.V5 as U5
uuid-bench/uuid-bench.cabal+27−20
@@ -14,7 +14,15 @@ build-type: Simple
1414
1515-- Benchmarking with older GHCs is not meaningful
1616tested-with:
17− GHC ==8.0.2 || ==8.2.2 || ==8.4.4 || ==8.6.4 || ==8.8.4 || ==8.10.3
17+ GHC ==8.6.5
18+ || ==8.8.4
19+ || ==8.10.7
20+ || ==9.0.2
21+ || ==9.2.8
22+ || ==9.4.8
23+ || ==9.6.6
24+ || ==9.8.2
25+ || ==9.10.1
1826
1927synopsis: UUID benchmarks
2028description:
@@ -32,25 +40,24 @@ source-repository head
3240
3341library
3442 build-depends:
35− base >=4.9 && <5
36− , binary >=0.4 && <0.9
37− , bytestring >=0.9 && <0.11
38− , cryptohash-md5 >=0.11.100 && <0.12
39− , cryptohash-sha1 >=0.11.100 && <0.12
40− , deepseq >=1.3 && <1.5
41− , entropy >=0.3.7 && <0.5
42− , hashable >=1.2.7.0 && <1.4
43− , network-info >=0.2 && <0.3
44− , random >=1.0.1 && <1.2
45− , text >=1.2.3 && <1.3
46− , time >=1.1 && <1.12
47− , uuid-types >=1.0.2 && <2
43+ base >=4.12.0.0 && <5
44+ , binary >=0.8.6.0 && <0.9
45+ , bytestring >=0.10.8.2 && <0.13
46+ , cryptohash-md5 >=0.11.100 && <0.12
47+ , cryptohash-sha1 >=0.11.100 && <0.12
48+ , deepseq >=1.4.4.0 && <1.6
49+ , entropy >=0.3.7 && <0.5
50+ , hashable >=1.4.4.0 && <1.6
51+ , network-info >=0.2 && <0.3
52+ , random >=1.2.1.2 && <1.3
53+ , template-haskell >=2.14.0.0 && <2.23
54+ , text >=1.2.3.0 && <1.3 || >=2.0 && <2.2
55+ , time >=1.4 && <1.13
4856
4957 -- uuid modules
5058 exposed-modules:
5159 Data.UUID
5260 Data.UUID.Util
53− Data.UUID.V1
5461 Data.UUID.V3
5562 Data.UUID.V4
5663 Data.UUID.V5
@@ -92,13 +99,13 @@ benchmark uuid-types-benchmark
9299
93100 -- deps w/o inherited constraints
94101 build-depends:
95− containers >=0.5 && <0.7
96− , criterion >=1.5 && <1.6
102+ containers >=0.5 && <0.8
103+ , criterion >=1.5 && <1.7
97104 , unordered-containers >=0.2.7 && <0.3
98105
99106benchmark uuid-benchmark
100107 type: exitcode-stdio-1.0
101− main-is: uuid-benchmark.hs
108+ main-is: uuid-benchmark.hs
102109 hs-source-dirs: bench
103110 default-language: Haskell2010
104111 default-extensions:
@@ -111,9 +118,9 @@ benchmark uuid-benchmark
111118 build-depends:
112119 base
113120 , random
114− , uuid
121+ , uuid-bench
115122
116123 -- deps w/o inherited constraints
117124 build-depends:
118− criterion >=1.5 && <1.6
125+ criterion >=1.5 && <1.7
119126 , mersenne-random-pure64 >=0.2 && <0.3
uuid-types/ChangeLog.md+9
@@ -1,9 +1,18 @@
1+## 1.0.6 (2023-04-16)
2+
3+- Support GHC-8.6.5..GHC-9.10.1
4+
5+## 1.0.5 (2021-05-03)
6+
7+- Add (Template Haskell) `Lift UUID` instance
8+
19## 1.0.4.0
210
311- Declare `Data.UUID.Types` module "`Trustworthy`" with respect to SafeHaskell.
412- Use more compact heap object representation which saves 16 bytes on 64bit platforms.
513- Add `toWords64`/`fromWords64` functions
614- Drop support for GHC < 7.
15+- Add support for `random-1.2`, i.e. idiomatic `Random` and added `Uniform` instances.
716
817## 1.0.3
918
uuid-types/src/Data/UUID/Types.hs−4
@@ -1,8 +1,4 @@
1−{-# LANGUAGE CPP #-}
2−
3−#if __GLASGOW_HASKELL__ >= 702
41{-# LANGUAGE Trustworthy #-}
5−#endif
62
73{- |
84Module : Data.UUID.Types
uuid-types/src/Data/UUID/Types/Internal.hs+15−43
@@ -2,10 +2,9 @@
22{-# LANGUAGE DeriveDataTypeable #-}
33{-# LANGUAGE TypeFamilies #-}
44{-# LANGUAGE ViewPatterns #-}
5−#if __GLASGOW_HASKELL__ >= 704
65{-# LANGUAGE Unsafe #-}
7−#endif
8−
6+{-# LANGUAGE DeriveLift #-}
7+{-# LANGUAGE StandaloneDeriving #-}
98{-# OPTIONS_HADDOCK hide #-}
109
1110-- |
@@ -47,13 +46,11 @@ module Data.UUID.Types.Internal
4746
4847import Prelude hiding (null)
4948
50−import Control.Applicative ((<*>))
5149import Control.DeepSeq (NFData (..))
5250import Control.Monad (guard, liftM2)
5351import Data.Bits
5452import Data.Char
5553import Data.Data
56−import Data.Functor ((<$>))
5754import Data.Hashable
5855import Data.List (elemIndices)
5956import Foreign.Ptr (Ptr)
@@ -72,13 +69,15 @@ import qualified Data.Text.Encoding as T
7269
7370import Data.UUID.Types.Internal.Builder
7471
75−import System.Random
72+import System.Random (Random (..), uniform)
73+import System.Random.Stateful (Uniform (..), uniformWord64)
7674
75+import Language.Haskell.TH.Syntax (Lift)
7776
7877-- | Type representing <https://en.wikipedia.org/wiki/UUID Universally Unique Identifiers (UUID)> as specified in
7978-- <http://tools.ietf.org/html/rfc4122 RFC 4122>.
8079data UUID = UUID {-# UNPACK #-} !Word64 {-# UNPACK #-} !Word64
81− deriving (Eq, Ord, Typeable)
80+ deriving (Eq, Ord)
8281{-
8382 Prior to uuid-types-1.0.4:
8483 !Word32 !Word32 !Word32 !Word32
@@ -456,23 +455,13 @@ fromASCIIBytes bs = do
456455-- | Similar to `toASCIIBytes` except we produce a lazy `BL.ByteString`.
457456toLazyASCIIBytes :: UUID -> BL.ByteString
458457toLazyASCIIBytes =
459−#if MIN_VERSION_bytestring(0,10,0)
460458 BL.fromStrict
461−#else
462− BL.fromChunks . return
463−#endif
464459 . toASCIIBytes
465460
466461-- | Similar to `fromASCIIBytes` except parses from a lazy `BL.ByteString`.
467462fromLazyASCIIBytes :: BL.ByteString -> Maybe UUID
468463fromLazyASCIIBytes bs =
469− if BL.length bs == 36 then fromASCIIBytes (
470−#if MIN_VERSION_bytestring(0,10,0)
471− BL.toStrict bs
472−#else
473− B.concat $ BL.toChunks bs
474−#endif
475− ) else Nothing
464+ if BL.length bs == 36 then fromASCIIBytes (BL.toStrict bs) else Nothing
476465
477466--
478467-- Class Instances
@@ -481,26 +470,15 @@ fromLazyASCIIBytes bs =
481470-- | This 'Random' instance produces __insecure__ version 4 UUIDs as
482471-- specified in <http://tools.ietf.org/html/rfc4122 RFC 4122>.
483472instance Random UUID where
484− random g = (fromGenNext w0 w1 w2 w3 w4, g4)
485− where (w0, g0) = next g
486− (w1, g1) = next g0
487− (w2, g2) = next g1
488− (w3, g3) = next g2
489− (w4, g4) = next g3
473+ random = uniform
490474 randomR _ = random -- range is ignored
491475
492−-- |Build a UUID from the results of five calls to next on a StdGen.
493−-- While next on StdGet returns an Int, it doesn't provide 32 bits of
494−-- randomness. This code relies on at last 28 bits of randomness in the
495−-- and optimizes its use so as to make only five random values, not six.
496−fromGenNext :: Int -> Int -> Int -> Int -> Int -> UUID
497−fromGenNext w0 w1 w2 w3 w4 =
498− buildFromBytes 4 /-/ (ThreeByte w0)
499− /-/ (ThreeByte w1)
500− /-/ w2 -- use all 4 bytes because we know the version
501− -- field will "cover" the upper, non-random bits
502− /-/ (ThreeByte w3)
503− /-/ (ThreeByte w4)
476+-- @since 1.0.4
477+instance Uniform UUID where
478+ uniformM gen = do
479+ w0 <- uniformWord64 gen
480+ w1 <- uniformWord64 gen
481+ pure $ buildFromBytes 4 /-/ w0 /-/ w1
504482
505483-- |A ByteSource to extract only three bytes from an Int, since next on StdGet
506484-- only returns 31 bits of randomness.
@@ -594,10 +572,4 @@ instance Data UUID where
594572uuidType :: DataType
595573uuidType = mkNoRepType "Data.UUID.Types.UUID"
596574
597−#if !MIN_VERSION_base(4,5,0)
598−unsafeShiftR, unsafeShiftL :: Bits w => w -> Int -> w
599−{-# INLINE unsafeShiftR #-}
600−unsafeShiftR = shiftR
601−{-# INLINE unsafeShiftL #-}
602−unsafeShiftL = shiftL
603−#endif
575+deriving instance Lift UUID
uuid-types/src/Data/UUID/Types/Internal/Builder.hs−3
@@ -1,8 +1,5 @@
1−{-# LANGUAGE CPP #-}
21{-# LANGUAGE TypeFamilies #-}
3−#if __GLASGOW_HASKELL__ >= 704
42{-# LANGUAGE Unsafe #-}
5−#endif
63
74{-# OPTIONS_HADDOCK hide #-}
85
uuid-types/tests/TestUUID.hs+7
@@ -1,4 +1,5 @@
11{-# LANGUAGE ViewPatterns #-}
2+{-# LANGUAGE TemplateHaskell #-}
23
34{-# OPTIONS_GHC -fno-warn-orphans #-}
45
@@ -40,6 +41,11 @@ test_nil = testGroup "nil" [
4041 testCase "nil bytes" $ U.toByteString U.nil @?= BL.pack (replicate 16 0)
4142 ]
4243
44+test_lift :: Test
45+test_lift = testCase "TH.Lift" $ do
46+ let uuid = U.fromWords64 123456789 987654321
47+ uuid @?= $( [| uuid |] )
48+
4349test_conv :: Test
4450test_conv = testGroup "conversions" [
4551 testCase "conv bytes to string" $
@@ -176,6 +182,7 @@ main = do
176182 [ [
177183 test_null,
178184 test_nil,
185+ test_lift,
179186 test_conv,
180187 test_fromByteString,
181188 test_fromWords,
uuid-types/uuid-types.cabal+28−21
@@ -1,6 +1,7 @@
11cabal-version: 1.12
22name: uuid-types
3−version: 1.0.4.0
3+version: 1.0.6
4+x-revision: 2
45copyright:
56 (c) 2017-2018 Herbert Valerio Riedel
67 (c) 2008-2014 Antoine Latter
@@ -12,16 +13,16 @@ license-file: LICENSE
1213category: Data
1314build-type: Simple
1415tested-with:
15− GHC ==7.4.2
16− || ==7.6.3
17− || ==7.8.4
18− || ==7.10.3
19− || ==8.0.2
20− || ==8.2.2
21− || ==8.4.4
22− || ==8.6.4
16+ GHC ==8.6.5
2317 || ==8.8.4
24− || ==8.10.3
18+ || ==8.10.7
19+ || ==9.0.2
20+ || ==9.2.8
21+ || ==9.4.8
22+ || ==9.6.6
23+ || ==9.8.4
24+ || ==9.10.1
25+ || ==9.12.1
2526
2627synopsis: Type definitions for Universally Unique Identifiers
2728description:
@@ -45,13 +46,14 @@ source-repository head
4546
4647library
4748 build-depends:
48− base >=4.3 && <5
49− , binary >=0.4 && <0.9
50− , bytestring >=0.9 && <0.11
51− , deepseq >=1.3 && <1.5
52− , hashable >=1.2.7.0 && <1.4
53− , random >=1.1 && <1.2
54− , text >=1.2.3 && <1.3
49+ base >=4.12.0.0 && <5
50+ , binary >=0.8.6.0 && <0.9
51+ , bytestring >=0.10.8.2 && <0.13
52+ , deepseq >=1.4.4.0 && <1.6
53+ , hashable >=1.4.4.0 && <1.6
54+ , random >=1.2.1.2 && <1.3
55+ , template-haskell >=2.14.0.0 && <2.24
56+ , text >=1.2.3.0 && <1.3 || >=2.0 && <2.2
5557
5658 exposed-modules: Data.UUID.Types
5759
@@ -75,18 +77,23 @@ test-suite testuuid
7577 default-language: Haskell2010
7678 other-extensions: ViewPatterns
7779 ghc-options: -Wall
80+ if impl(ghc >= 8.10)
81+ ghc-options: -Wunused-packages
7882
7983 -- inherited constraints
8084 build-depends:
8185 base
8286 , binary
8387 , bytestring
88+ , template-haskell
8489 , uuid-types
8590
8691 -- deps w/o inherited constraints
8792 build-depends:
88− ghc-byteorder >=4.11 && <4.12
89− , QuickCheck >=2.14.2 && <2.15
90− , tasty >=1.4.0.1 && <1.5
93+ QuickCheck >=2.14.2 && <2.16
94+ , tasty >=1.4.0.1 && <1.6
9195 , tasty-hunit >=0.10 && <0.11
92− , tasty-quickcheck >=0.10 && <0.11
96+ , tasty-quickcheck >=0.10 && <0.12
97+
98+ if !impl(ghc >=8.4)
99+ build-depends: ghc-byteorder >=4.11 && <4.12
uuid/CHANGES.md+15−1
@@ -1,9 +1,23 @@
1+1.3.16
2+
3+- Support GHC-8.6.5...9.10.1
4+
5+1.3.15
6+
7+- Add (Template Haskell) `Lift UUID` instance
8+
9+1.3.14
10+
11+- Use more compact heap object representation which saves 16 bytes on 64bit platforms.
12+- Add `toWords64`/`fromWords64` functions
13+
1141.3.13
215
316- Optimize `V4.nextRandom` (~3x speed increase)
417- Optimize UUID V3 & V5 generation (~2x speed increase)
518- Use `cryptohash-md5`/`cryptohash-sha1`/`entropy` instead
6− of `memory`/`cryptonite` for better performance and stability.
19+ of `memory`/`cryptonite` for better performance and stability,
20+ but GHCJS is now no longer supported.
721- Update cabal-spec to version 1.10
822
9231.3.12
uuid/src/Data/UUID.hs+2−3
@@ -18,9 +18,6 @@ See <http://tools.ietf.org/html/rfc4122> for the specification.
1818favorite instance of 'System.Random.Random' for faster but insecure
1919generation of UUIDs.
2020
21−* We have an implementation of generating a UUID from the hardware
22−MAC address and current system time in "Data.UUID.V1".
23−
2421* For name-based generation of UUIDs using SHA-1 hashing see
2522"Data.UUID.V5".
2623-}
@@ -37,6 +34,8 @@ module Data.UUID(UUID
3734 ,fromByteString
3835 ,toWords
3936 ,fromWords
37+ ,toWords64
38+ ,fromWords64
4039 ,null
4140 ,nil
4241 ) where
uuid/src/Data/UUID/Util.hs−11
@@ -3,7 +3,6 @@ module Data.UUID.Util (
33 UnpackedUUID(..)
44 , unpack, pack
55 , version
6− , extractMac
76 , extractTime
87 , setTime
98 ) where
@@ -13,7 +12,6 @@ import Data.Word
1312import Data.Word.Util
1413import Data.Bits
1514import Data.UUID.Types.Internal
16−import Network.Info
1715import Data.Int (Int64)
1816
1917version :: UUID -> Int
@@ -42,12 +40,3 @@ extractTime uuid =
4240
4341timeAndVersionToTime :: Word16 -> Word16
4442timeAndVersionToTime tv = tv .&. 0x0FFF
45−
46−extractMac :: UUID -> Maybe MAC
47−extractMac uuid =
48− if version uuid == 1
49− then Just $
50− MAC (node_0 unpacked) (node_1 unpacked) (node_2 unpacked) (node_3 unpacked) (node_4 unpacked) (node_5 unpacked)
51− else Nothing
52− where
53− unpacked = unpack uuid
uuid/src/Data/UUID/V1.hsdeleted−135
@@ -1,135 +0,0 @@
1−{-# OPTIONS_GHC -fno-cse #-}
2−{-# LANGUAGE TypeFamilies #-}
3−
4−{- |
5−Module : Data.UUID.V1
6−Copyright : (c) 2008 Jason Dusek
7− (c) 2009 Mark Lentczner
8− (c) 2009-2010,2012 Antoine Latter
9−
10−License : BSD-style
11−
12−Maintainer : aslatter@gmail.com
13−Stability : experimental
14−Portability : portable
15−
16−RFC 4122 Version 1 UUID state machine.
17−
18−The generated UUID is based on the hardware MAC
19−address and the system clock.
20−
21−If we cannot lookup the MAC address we seed the
22−generator with a psuedo-random number.
23−-}
24−
25−module Data.UUID.V1(nextUUID)
26−where
27−
28−
29−import Data.Bits
30−import Data.Maybe
31−import Data.Time
32−import Data.Word
33−
34−import Control.Applicative ((<$>),(<*>))
35−import Control.Concurrent.MVar
36−import System.IO.Unsafe
37−
38−import qualified System.Random as R
39−
40−import Network.Info
41−
42−import Data.UUID.Types.Internal.Builder
43−import Data.UUID.Types.Internal
44−
45−-- | Returns a new UUID derived from the local hardware MAC
46−-- address and the current system time.
47−-- Is generated according to the Version 1 UUID specified in
48−-- RFC 4122.
49−--
50−-- Returns 'Nothing' if you request UUIDs too quickly.
51−nextUUID :: IO (Maybe UUID)
52−nextUUID = do
53− res <- stepTime
54− case res of
55− Just (mac', c, t) -> return $ Just $ makeUUID t c mac'
56− _ -> return Nothing
57−
58−
59−makeUUID :: Word64 -> Word16 -> MAC -> UUID
60−makeUUID time clock mac' =
61− buildFromBytes 1 /-/ tLow /-/ tMid /-/ tHigh /-/ clock /-/ (MACSource mac')
62− where tLow = (fromIntegral time) :: Word32
63− tMid = (fromIntegral (time `shiftR` 32)) :: Word16
64− tHigh = (fromIntegral (time `shiftR` 48)) :: Word16
65−
66−newtype MACSource = MACSource MAC
67−instance ByteSource MACSource where
68− z /-/ (MACSource (MAC a b c d e f)) = z a b c d e f
69−type instance ByteSink MACSource g = Takes3Bytes (Takes3Bytes g)
70−
71−
72−-- |Approximates the clock algorithm in RFC 4122, section 4.2
73−-- Isn't system wide or thread safe, nor does it properly randomize
74−-- the clock value on initialization.
75−stepTime :: IO (Maybe (MAC, Word16, Word64))
76−stepTime = do
77− h1 <- fmap hundredsOfNanosSinceGregorianReform getCurrentTime
78− modifyMVar state $ \s@(State mac' c0 h0) ->
79− if h1 > h0
80− then
81− return (State mac' c0 h1, Just (mac', c0, h1))
82− else
83− let
84− c1 = succ c0
85− in if c1 <= 0x3fff -- when clock is initially randomized,
86− -- then this test will need to change
87− then
88− return (State mac' c1 h1, Just (mac', c1, h1))
89− else
90− return (s, Nothing)
91−
92−
93−{-# NOINLINE state #-}
94−state :: MVar State
95−state = unsafePerformIO $ do
96− h0 <- fmap hundredsOfNanosSinceGregorianReform getCurrentTime
97− mac' <- getMac
98− newMVar $ State mac' 0 h0 -- the 0 should be a random number
99−
100−-- SysMAC.mac can fail on some machines.
101−-- In those cases we fake it with a random
102−-- 6 bytes seed.
103−getMac :: IO MAC
104−getMac =
105− getNetworkInterfaces >>=
106− return . listToMaybe . filter (minBound /=) . map mac >>=
107− \macM -> case macM of
108− Just m -> return m
109− Nothing -> randomMac
110−
111−randomMac :: IO MAC
112−randomMac =
113− -- I'm too lazy to thread through
114− -- the random state ...
115− MAC
116− <$> (R.randomIO >>= return . (1 .|.)) -- We must set the multicast bit to True. See section 4.5 of the RFC.
117− <*> R.randomIO
118− <*> R.randomIO
119− <*> R.randomIO
120− <*> R.randomIO
121− <*> R.randomIO
122−
123−data State = State
124− {-# UNPACK #-} !MAC
125− {-# UNPACK #-} !Word16
126− {-# UNPACK #-} !Word64
127− deriving (Show)
128−
129−
130−
131−hundredsOfNanosSinceGregorianReform :: UTCTime -> Word64
132−hundredsOfNanosSinceGregorianReform t = floor $ 10000000 * dt
133− where
134− gregorianReform = UTCTime (fromGregorian 1582 10 15) 0
135− dt = t `diffUTCTime` gregorianReform
uuid/src/Data/UUID/V3.hs+1−1
@@ -8,7 +8,7 @@ Maintainer : aslatter@gmail.com
88Stability : experimental
99Portability : portable
1010
11−NOTE: This module uses MD5 hashing. Unless you know
11+NOTE\: This module uses MD5 hashing. Unless you know
1212you need to use this module, you should probably be
1313using "Data.UUID.V5", which offers the same sort of
1414functionality as this module except implemented with
uuid/src/Data/UUID/V4.hs+5−4
@@ -11,8 +11,8 @@
1111 This module implements Version 4 UUIDs as specified
1212 in RFC 4122.
1313
14− These UUIDs are generated from a pseddo-random generator.
15− We use 'getEntropy' method from <https://hackage.haskell.org/package/entropy entropy> package,
14+ These UUIDs are generated from a pseudo-random generator.
15+ We use the 'getEntropy' method from the <https://hackage.haskell.org/package/entropy entropy> package,
1616 which should provide cryptographically secure random data.
1717-}
1818module Data.UUID.V4 (nextRandom) where
@@ -23,8 +23,9 @@ import Data.UUID.Types.Internal ( buildFromBytes )
2323import System.Entropy ( getEntropy )
2424import Data.ByteString ( unpack )
2525
26−-- | Generate a crytographically secure, random UUID. Introduced in version
27−-- 1.2.6.
26+-- | Generate a crytographically secure, random UUID.
27+--
28+-- @since 1.2.6
2829nextRandom :: IO UUID
2930nextRandom = do
3031 [b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, ba, bb, bc, bd, be, bf]
uuid/tests/TestUUID.hs+4−20
@@ -1,18 +1,15 @@
11{-# LANGUAGE ViewPatterns #-}
22
3−import Control.Monad (replicateM)
43import Data.Bits
54import qualified Data.ByteString.Lazy as BL
65import Data.Char (ord)
7−import Data.List (nub, (\\))
86import Data.Maybe
97import Data.Word
108import qualified Data.UUID as U
11−import qualified Data.UUID.V1 as U
129import qualified Data.UUID.V3 as U3
1310import qualified Data.UUID.V5 as U5
1411
15−import Test.QuickCheck ( Arbitrary(arbitrary), choose )
12+import Test.QuickCheck ( Arbitrary(arbitrary) )
1613import Test.Tasty ( TestTree, testGroup, defaultMain )
1714import Test.Tasty.HUnit
1815 ( assertBool, (@?=), testCase )
@@ -24,13 +21,13 @@ isValidVersion :: Int -> U.UUID -> Bool
2421isValidVersion v u = lenOK && variantOK && versionOK
2522 where bs = U.toByteString u
2623 lenOK = BL.length bs == 16
27− variantOK = (BL.index bs 8) .&. 0xc0 == 0x80
28− versionOK = (BL.index bs 6) .&. 0xf0 == fromIntegral (v `shiftL` 4)
24+ variantOK = BL.index bs 8 .&. 0xc0 == 0x80
25+ versionOK = BL.index bs 6 .&. 0xf0 == fromIntegral (v `shiftL` 4)
2926
3027
3128instance Arbitrary U.UUID where
3229 -- the UUID random instance ignores bounds
33− arbitrary = choose (U.nil, U.nil)
30+ arbitrary = pure U.nil
3431
3532
3633test_null :: Test
@@ -38,17 +35,6 @@ test_null =
3835 testCase "namespaceDNS is not null" $
3936 assertBool "" (not $ U.null U3.namespaceDNS)
4037
41−test_v1 :: [Maybe U.UUID] -> Test
42−test_v1 v1s = testGroup "version 1" [
43− testCase "V1 unique" $ nub (v1s \\ nub v1s) @?= [],
44− testGroup "V1 not null" $ map (testUUID (not . U.null)) v1s,
45− testGroup "V1 valid" $ map (testUUID (isValidVersion 1)) v1s
46− ]
47− where testUUID :: (U.UUID -> Bool) -> Maybe U.UUID -> Test
48− testUUID p u =
49− testCase (show u) $
50− assertBool "" $ maybe False p u
51−
5238test_v3 :: Test
5339test_v3 =
5440 testCase "V3 computation" $
@@ -93,13 +79,11 @@ prop_v5Valid = testProperty "V5 valid" v5Valid
9379
9480main :: IO ()
9581main = do
96− v1s <- replicateM 100 U.nextUUID
9782 defaultMain $
9883 testGroup "tests" $
9984 concat $
10085 [ [
10186 test_null,
102− test_v1 v1s,
10387 test_v3,
10488 test_v5
10589 ]
uuid/uuid.cabal+24−23
@@ -1,6 +1,7 @@
11cabal-version: 1.12
22name: uuid
3−version: 1.3.13
3+version: 1.3.16
4+x-revision: 2
45copyright: (c) 2008-2014 Antoine Latter
56author: Antoine Latter
67maintainer: Oleg Grenrus <oleg.grenrus@iki.fi>
@@ -9,16 +10,16 @@ license-file: LICENSE
910category: Data
1011build-type: Simple
1112tested-with:
12− GHC ==7.4.2
13− || ==7.6.3
14− || ==7.8.4
15− || ==7.10.3
16− || ==8.0.2
17− || ==8.2.2
18− || ==8.4.4
19− || ==8.6.4
13+ GHC ==8.6.5
2014 || ==8.8.4
21− || ==8.10.3
15+ || ==8.10.7
16+ || ==9.0.2
17+ || ==9.2.8
18+ || ==9.4.8
19+ || ==9.6.6
20+ || ==9.8.4
21+ || ==9.10.1
22+ || ==9.12.1
2223
2324synopsis:
2425 For creating, comparing, parsing and printing Universally Unique Identifiers
@@ -40,22 +41,19 @@ source-repository head
4041
4142library
4243 build-depends:
43− base >=4.3 && <5
44− , binary >=0.4 && <0.9
45− , bytestring >=0.9 && <0.11
44+ base >=4.12 && <5
45+ , binary >=0.8.6.0 && <0.9
46+ , bytestring >=0.10.8.2 && <0.13
4647 , cryptohash-md5 >=0.11.100 && <0.12
4748 , cryptohash-sha1 >=0.11.100 && <0.12
4849 , entropy >=0.3.7 && <0.5
49− , network-info >=0.2 && <0.3
50− , random >=1.1 && <1.2
51− , text >=1.2.3 && <1.3
52− , time >=1.1 && <1.12
53− , uuid-types >=1.0.2 && <2
5450
51+ -- strict dependency on uuid-types,
52+ -- as we re-rexport datatype, thus leak instances etc.
53+ build-depends: uuid-types >=1.0.6 && <1.0.7
5554 exposed-modules:
5655 Data.UUID
5756 Data.UUID.Util
58− Data.UUID.V1
5957 Data.UUID.V3
6058 Data.UUID.V4
6159 Data.UUID.V5
@@ -68,6 +66,8 @@ library
6866 default-extensions: DeriveDataTypeable
6967 other-extensions: TypeFamilies
7068 ghc-options: -Wall
69+ if impl(ghc >= 8.10)
70+ ghc-options: -Wunused-packages
7171 hs-source-dirs: src
7272
7373test-suite testuuid
@@ -78,17 +78,18 @@ test-suite testuuid
7878 default-extensions: DeriveDataTypeable
7979 other-extensions: ViewPatterns
8080 ghc-options: -Wall -fno-warn-orphans
81+ if impl(ghc >= 8.10)
82+ ghc-options: -Wunused-packages
8183
8284 -- inherited constraints
8385 build-depends:
8486 base
8587 , bytestring
86− , random
8788 , uuid
8889
8990 -- deps w/o inherited constraints
9091 build-depends:
91− QuickCheck >=2.14.2 && <2.15
92− , tasty >=1.4.0.1 && <1.5
92+ QuickCheck >=2.14.2 && <2.16
93+ , tasty >=1.4.0.1 && <1.6
9394 , tasty-hunit >=0.10 && <0.11
94− , tasty-quickcheck >=0.10 && <0.11
95+ , tasty-quickcheck >=0.10 && <0.12