on master help sign in
.git-blame-ignore-revsnew file+2
since splitsnapshots
unifiedsplit
@@ -0,0 +1,2 @@
1+# Move code into subdirectories
2+bf1ac1bad848bb2c081f0cae1631bf53811ec05a
.github/workflows/haskell-ci-bench.ymlnew file+241
@@ -0,0 +1,241 @@
1+# This GitHub workflow config has been generated by a script via
2+#
3+# haskell-ci 'github' '--project' 'cabal.bench.project' '-o' '.github/workflows/haskell-ci-bench.yml' '--github-action-name' 'Benchmarks'
4+#
5+# To regenerate the script (for example after adjusting tested-with) run
6+#
7+# haskell-ci regenerate
8+#
9+# For more information, see https://github.com/haskell-CI/haskell-ci
10+#
11+# version: 0.19.20240702
12+#
13+# REGENDATA ("0.19.20240702",["github","--project","cabal.bench.project","-o",".github/workflows/haskell-ci-bench.yml","--github-action-name","Benchmarks"])
14+#
15+name: Benchmarks
16+on:
17+ push:
18+ branches:
19+ - master
20+ pull_request:
21+ branches:
22+ - master
23+jobs:
24+ linux:
25+ name: Benchmarks - Linux - ${{ matrix.compiler }}
26+ runs-on: ubuntu-20.04
27+ timeout-minutes:
28+ 60
29+ container:
30+ image: buildpack-deps:jammy
31+ continue-on-error: ${{ matrix.allow-failure }}
32+ strategy:
33+ matrix:
34+ include:
35+ - compiler: ghc-9.10.1
36+ compilerKind: ghc
37+ compilerVersion: 9.10.1
38+ setup-method: ghcup
39+ allow-failure: false
40+ - compiler: ghc-9.8.2
41+ compilerKind: ghc
42+ compilerVersion: 9.8.2
43+ setup-method: ghcup
44+ allow-failure: false
45+ - compiler: ghc-9.6.6
46+ compilerKind: ghc
47+ compilerVersion: 9.6.6
48+ setup-method: ghcup
49+ allow-failure: false
50+ - compiler: ghc-9.4.8
51+ compilerKind: ghc
52+ compilerVersion: 9.4.8
53+ setup-method: ghcup
54+ allow-failure: false
55+ - compiler: ghc-9.2.8
56+ compilerKind: ghc
57+ compilerVersion: 9.2.8
58+ setup-method: ghcup
59+ allow-failure: false
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
79+ allow-failure: false
80+ fail-fast: false
81+ steps:
82+ - name: apt
83+ run: |
84+ apt-get update
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)
91+ env:
92+ HCKIND: ${{ matrix.compilerKind }}
93+ HCNAME: ${{ matrix.compiler }}
94+ HCVER: ${{ matrix.compilerVersion }}
95+ - name: Set PATH and environment variables
96+ run: |
97+ echo "$HOME/.cabal/bin" >> $GITHUB_PATH
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"
109+ HCNUMVER=$(${HC} --numeric-version|perl -ne '/^(\d+)\.(\d+)\.(\d+)(\.(\d+))?$/; print(10000 * $1 + 100 * $2 + ($3 == 0 ? $5 != 1 : $3))')
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"
116+ env:
117+ HCKIND: ${{ matrix.compilerKind }}
118+ HCNAME: ${{ matrix.compiler }}
119+ HCVER: ${{ matrix.compilerVersion }}
120+ - name: env
121+ run: |
122+ env
123+ - name: write cabal config
124+ run: |
125+ mkdir -p $CABAL_DIR
126+ cat >> $CABAL_CONFIG <<EOF
127+ remote-build-reporting: anonymous
128+ write-ghc-environment-files: never
129+ remote-repo-cache: $CABAL_DIR/packages
130+ logs-dir: $CABAL_DIR/logs
131+ world-file: $CABAL_DIR/world
132+ extra-prog-path: $CABAL_DIR/bin
133+ symlink-bindir: $CABAL_DIR/bin
134+ installdir: $CABAL_DIR/bin
135+ build-summary: $CABAL_DIR/logs/build.log
136+ store-dir: $CABAL_DIR/store
137+ install-dirs user
138+ prefix: $CABAL_DIR
139+ repository hackage.haskell.org
140+ url: http://hackage.haskell.org/
141+ EOF
142+ cat >> $CABAL_CONFIG <<EOF
143+ program-default-options
144+ ghc-options: $GHCJOBS +RTS -M3G -RTS
145+ EOF
146+ cat $CABAL_CONFIG
147+ - name: versions
148+ run: |
149+ $HC --version || true
150+ $HC --print-project-git-commit-id || true
151+ $CABAL --version || true
152+ - name: update cabal index
153+ run: |
154+ $CABAL v2-update -v
155+ - name: install cabal-plan
156+ run: |
157+ mkdir -p $HOME/.cabal/bin
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 -
160+ xz -d < cabal-plan.xz > $HOME/.cabal/bin/cabal-plan
161+ rm -f cabal-plan.xz
162+ chmod a+x $HOME/.cabal/bin/cabal-plan
163+ cabal-plan --version
164+ - name: checkout
165+ uses: actions/checkout@v4
166+ with:
167+ path: source
168+ - name: initial cabal.project for sdist
169+ run: |
170+ touch cabal.project
171+ echo "packages: $GITHUB_WORKSPACE/source/uuid-bench" >> cabal.project
172+ cat cabal.project
173+ - name: sdist
174+ run: |
175+ mkdir -p sdist
176+ $CABAL sdist all --output-dir $GITHUB_WORKSPACE/sdist
177+ - name: unpack
178+ run: |
179+ mkdir -p unpacked
180+ find sdist -maxdepth 1 -type f -name '*.tar.gz' -exec tar -C $GITHUB_WORKSPACE/unpacked -xzvf {} \;
181+ - name: generate cabal.project
182+ run: |
183+ PKGDIR_uuid_bench="$(find "$GITHUB_WORKSPACE/unpacked" -maxdepth 1 -type d -regex '.*/uuid-bench-[0-9.]*')"
184+ echo "PKGDIR_uuid_bench=${PKGDIR_uuid_bench}" >> "$GITHUB_ENV"
185+ rm -f cabal.project cabal.project.local
186+ touch cabal.project
187+ touch cabal.project.local
188+ echo "packages: ${PKGDIR_uuid_bench}" >> cabal.project
189+ echo "package uuid-bench" >> cabal.project
190+ echo " ghc-options: -Werror=missing-methods" >> cabal.project
191+ cat >> cabal.project <<EOF
192+ EOF
193+ $HCPKG list --simple-output --names-only | perl -ne 'for (split /\s+/) { print "constraints: any.$_ installed\n" unless /^(uuid-bench)$/; }' >> cabal.project.local
194+ cat cabal.project
195+ cat cabal.project.local
196+ - name: dump install plan
197+ run: |
198+ $CABAL v2-build $ARG_COMPILER $ARG_TESTS $ARG_BENCH --dry-run all
199+ cabal-plan
200+ - name: restore cache
201+ uses: actions/cache/restore@v4
202+ with:
203+ key: ${{ runner.os }}-${{ matrix.compiler }}-${{ github.sha }}
204+ path: ~/.cabal/store
205+ restore-keys: ${{ runner.os }}-${{ matrix.compiler }}-
206+ - name: install dependencies
207+ run: |
208+ $CABAL v2-build $ARG_COMPILER --disable-tests --disable-benchmarks --dependencies-only -j2 all
209+ $CABAL v2-build $ARG_COMPILER $ARG_TESTS $ARG_BENCH --dependencies-only -j2 all
210+ - name: build w/o tests
211+ run: |
212+ $CABAL v2-build $ARG_COMPILER --disable-tests --disable-benchmarks all
213+ - name: build
214+ run: |
215+ $CABAL v2-build $ARG_COMPILER $ARG_TESTS $ARG_BENCH all --write-ghc-environment-files=always
216+ - name: cabal check
217+ run: |
218+ cd ${PKGDIR_uuid_bench} || false
219+ ${CABAL} -vnormal check
220+ - name: haddock
221+ run: |
222+ $CABAL v2-haddock --disable-documentation --haddock-all $ARG_COMPILER --with-haddock $HADDOCK $ARG_TESTS $ARG_BENCH all
223+ - name: unconstrained build
224+ run: |
225+ rm -f cabal.project.local
226+ $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.ymlnew file+262
@@ -0,0 +1,262 @@
1+# This GitHub workflow config has been generated by a script via
2+#
3+# haskell-ci 'github' 'cabal.project'
4+#
5+# To regenerate the script (for example after adjusting tested-with) run
6+#
7+# haskell-ci regenerate
8+#
9+# For more information, see https://github.com/haskell-CI/haskell-ci
10+#
11+# version: 0.19.20241223
12+#
13+# REGENDATA ("0.19.20241223",["github","cabal.project"])
14+#
15+name: Haskell-CI
16+on:
17+ push:
18+ branches:
19+ - master
20+ pull_request:
21+ branches:
22+ - master
23+jobs:
24+ linux:
25+ name: Haskell-CI - Linux - ${{ matrix.compiler }}
26+ runs-on: ubuntu-20.04
27+ timeout-minutes:
28+ 60
29+ container:
30+ image: buildpack-deps:jammy
31+ continue-on-error: ${{ matrix.allow-failure }}
32+ strategy:
33+ matrix:
34+ include:
35+ - compiler: ghc-9.12.1
36+ compilerKind: ghc
37+ compilerVersion: 9.12.1
38+ setup-method: ghcup
39+ allow-failure: false
40+ - compiler: ghc-9.10.1
41+ compilerKind: ghc
42+ compilerVersion: 9.10.1
43+ setup-method: ghcup
44+ allow-failure: false
45+ - compiler: ghc-9.8.4
46+ compilerKind: ghc
47+ compilerVersion: 9.8.4
48+ setup-method: ghcup
49+ allow-failure: false
50+ - compiler: ghc-9.6.6
51+ compilerKind: ghc
52+ compilerVersion: 9.6.6
53+ setup-method: ghcup
54+ allow-failure: false
55+ - compiler: ghc-9.4.8
56+ compilerKind: ghc
57+ compilerVersion: 9.4.8
58+ setup-method: ghcup
59+ allow-failure: false
60+ - compiler: ghc-9.2.8
61+ compilerKind: ghc
62+ compilerVersion: 9.2.8
63+ setup-method: ghcup
64+ allow-failure: false
65+ - compiler: ghc-9.0.2
66+ compilerKind: ghc
67+ compilerVersion: 9.0.2
68+ setup-method: ghcup
69+ allow-failure: false
70+ - compiler: ghc-8.10.7
71+ compilerKind: ghc
72+ compilerVersion: 8.10.7
73+ setup-method: ghcup
74+ allow-failure: false
75+ - compiler: ghc-8.8.4
76+ compilerKind: ghc
77+ compilerVersion: 8.8.4
78+ setup-method: ghcup
79+ allow-failure: false
80+ - compiler: ghc-8.6.5
81+ compilerKind: ghc
82+ compilerVersion: 8.6.5
83+ setup-method: ghcup
84+ allow-failure: false
85+ fail-fast: false
86+ steps:
87+ - name: apt-get install
88+ run: |
89+ apt-get update
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"
110+ env:
111+ HCKIND: ${{ matrix.compilerKind }}
112+ HCNAME: ${{ matrix.compiler }}
113+ HCVER: ${{ matrix.compilerVersion }}
114+ - name: Set PATH and environment variables
115+ run: |
116+ echo "$HOME/.cabal/bin" >> $GITHUB_PATH
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"
120+ HCNUMVER=$(${HC} --numeric-version|perl -ne '/^(\d+)\.(\d+)\.(\d+)(\.(\d+))?$/; print(10000 * $1 + 100 * $2 + ($3 == 0 ? $5 != 1 : $3))')
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"
126+ env:
127+ HCKIND: ${{ matrix.compilerKind }}
128+ HCNAME: ${{ matrix.compiler }}
129+ HCVER: ${{ matrix.compilerVersion }}
130+ - name: env
131+ run: |
132+ env
133+ - name: write cabal config
134+ run: |
135+ mkdir -p $CABAL_DIR
136+ cat >> $CABAL_CONFIG <<EOF
137+ remote-build-reporting: anonymous
138+ write-ghc-environment-files: never
139+ remote-repo-cache: $CABAL_DIR/packages
140+ logs-dir: $CABAL_DIR/logs
141+ world-file: $CABAL_DIR/world
142+ extra-prog-path: $CABAL_DIR/bin
143+ symlink-bindir: $CABAL_DIR/bin
144+ installdir: $CABAL_DIR/bin
145+ build-summary: $CABAL_DIR/logs/build.log
146+ store-dir: $CABAL_DIR/store
147+ install-dirs user
148+ prefix: $CABAL_DIR
149+ repository hackage.haskell.org
150+ url: http://hackage.haskell.org/
151+ EOF
152+ cat >> $CABAL_CONFIG <<EOF
153+ program-default-options
154+ ghc-options: $GHCJOBS +RTS -M3G -RTS
155+ EOF
156+ cat $CABAL_CONFIG
157+ - name: versions
158+ run: |
159+ $HC --version || true
160+ $HC --print-project-git-commit-id || true
161+ $CABAL --version || true
162+ - name: update cabal index
163+ run: |
164+ $CABAL v2-update -v
165+ - name: install cabal-plan
166+ run: |
167+ mkdir -p $HOME/.cabal/bin
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 -
170+ xz -d < cabal-plan.xz > $HOME/.cabal/bin/cabal-plan
171+ rm -f cabal-plan.xz
172+ chmod a+x $HOME/.cabal/bin/cabal-plan
173+ cabal-plan --version
174+ - name: checkout
175+ uses: actions/checkout@v4
176+ with:
177+ path: source
178+ - name: initial cabal.project for sdist
179+ run: |
180+ touch cabal.project
181+ echo "packages: $GITHUB_WORKSPACE/source/uuid-types" >> cabal.project
182+ echo "packages: $GITHUB_WORKSPACE/source/uuid" >> cabal.project
183+ cat cabal.project
184+ - name: sdist
185+ run: |
186+ mkdir -p sdist
187+ $CABAL sdist all --output-dir $GITHUB_WORKSPACE/sdist
188+ - name: unpack
189+ run: |
190+ mkdir -p unpacked
191+ find sdist -maxdepth 1 -type f -name '*.tar.gz' -exec tar -C $GITHUB_WORKSPACE/unpacked -xzvf {} \;
192+ - name: generate cabal.project
193+ run: |
194+ PKGDIR_uuid_types="$(find "$GITHUB_WORKSPACE/unpacked" -maxdepth 1 -type d -regex '.*/uuid-types-[0-9.]*')"
195+ echo "PKGDIR_uuid_types=${PKGDIR_uuid_types}" >> "$GITHUB_ENV"
196+ PKGDIR_uuid="$(find "$GITHUB_WORKSPACE/unpacked" -maxdepth 1 -type d -regex '.*/uuid-[0-9.]*')"
197+ echo "PKGDIR_uuid=${PKGDIR_uuid}" >> "$GITHUB_ENV"
198+ rm -f cabal.project cabal.project.local
199+ touch cabal.project
200+ touch cabal.project.local
201+ echo "packages: ${PKGDIR_uuid_types}" >> cabal.project
202+ echo "packages: ${PKGDIR_uuid}" >> cabal.project
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
207+ cat >> cabal.project <<EOF
208+ EOF
209+ $HCPKG list --simple-output --names-only | perl -ne 'for (split /\s+/) { print "constraints: any.$_ installed\n" unless /^(uuid|uuid-types)$/; }' >> cabal.project.local
210+ cat cabal.project
211+ cat cabal.project.local
212+ - name: dump install plan
213+ run: |
214+ $CABAL v2-build $ARG_COMPILER $ARG_TESTS $ARG_BENCH --dry-run all
215+ cabal-plan
216+ - name: restore cache
217+ uses: actions/cache/restore@v4
218+ with:
219+ key: ${{ runner.os }}-${{ matrix.compiler }}-${{ github.sha }}
220+ path: ~/.cabal/store
221+ restore-keys: ${{ runner.os }}-${{ matrix.compiler }}-
222+ - name: install dependencies
223+ run: |
224+ $CABAL v2-build $ARG_COMPILER --disable-tests --disable-benchmarks --dependencies-only -j2 all
225+ $CABAL v2-build $ARG_COMPILER $ARG_TESTS $ARG_BENCH --dependencies-only -j2 all
226+ - name: build w/o tests
227+ run: |
228+ $CABAL v2-build $ARG_COMPILER --disable-tests --disable-benchmarks all
229+ - name: build
230+ run: |
231+ $CABAL v2-build $ARG_COMPILER $ARG_TESTS $ARG_BENCH all --write-ghc-environment-files=always
232+ - name: tests
233+ run: |
234+ $CABAL v2-test $ARG_COMPILER $ARG_TESTS $ARG_BENCH all --test-show-details=direct
235+ - name: cabal check
236+ run: |
237+ cd ${PKGDIR_uuid_types} || false
238+ ${CABAL} -vnormal check
239+ cd ${PKGDIR_uuid} || false
240+ ${CABAL} -vnormal check
241+ - name: haddock
242+ run: |
243+ $CABAL v2-haddock --disable-documentation --haddock-all $ARG_COMPILER --with-haddock $HADDOCK $ARG_TESTS $ARG_BENCH all
244+ - name: unconstrained build
245+ run: |
246+ rm -f cabal.project.local
247+ $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
.travis.ymldeleted−77
@@ -1,77 +0,0 @@
1−# This Travis job script has been generated by a script via
2−#
3−# make_travis_yml_2.hs 'uuid-types.cabal'
4−#
5−# For more information, see https://github.com/hvr/multi-ghc-travis
6−#
7−language: c
8−sudo: false
9−dist: trusty
10−
11−git:
12− submodules: false # whether to recursively clone submodules
13−
14−cache:
15− directories:
16− - $HOME/.cabal/packages
17− - $HOME/.cabal/store
18−
19−before_cache:
20− - rm -fv $HOME/.cabal/packages/hackage.haskell.org/build-reports.log
21− # remove files that are regenerated by 'cabal update'
22− - rm -fv $HOME/.cabal/packages/hackage.haskell.org/00-index.*
23− - rm -fv $HOME/.cabal/packages/hackage.haskell.org/*.json
24− - rm -fv $HOME/.cabal/packages/hackage.haskell.org/01-index.cache
25− - rm -fv $HOME/.cabal/packages/hackage.haskell.org/01-index.tar
26− - rm -fv $HOME/.cabal/packages/hackage.haskell.org/01-index.tar.idx
27−
28−matrix:
29− include:
30− # - compiler: "ghc-7.0.4"
31− # # env: TEST=--disable-tests BENCH=--disable-benchmarks
32− # addons: {apt: {packages: [ghc-ppa-tools,cabal-install-head,ghc-7.0.4], sources: [hvr-ghc]}}
33− - compiler: "ghc-7.4.2"
34− # env: TEST=--disable-tests BENCH=--disable-benchmarks
35− addons: {apt: {packages: [ghc-ppa-tools,cabal-install-head,ghc-7.4.2], sources: [hvr-ghc]}}
36− - compiler: "ghc-7.6.3"
37− # env: TEST=--disable-tests BENCH=--disable-benchmarks
38− addons: {apt: {packages: [ghc-ppa-tools,cabal-install-head,ghc-7.6.3], sources: [hvr-ghc]}}
39− - compiler: "ghc-7.8.4"
40− # env: TEST=--disable-tests BENCH=--disable-benchmarks
41− addons: {apt: {packages: [ghc-ppa-tools,cabal-install-head,ghc-7.8.4], sources: [hvr-ghc]}}
42− - compiler: "ghc-7.10.3"
43− # env: TEST=--disable-tests BENCH=--disable-benchmarks
44− addons: {apt: {packages: [ghc-ppa-tools,cabal-install-head,ghc-7.10.3], sources: [hvr-ghc]}}
45− - compiler: "ghc-8.0.2"
46− # env: TEST=--disable-tests BENCH=--disable-benchmarks
47− addons: {apt: {packages: [ghc-ppa-tools,cabal-install-head,ghc-8.0.2], sources: [hvr-ghc]}}
48−
49−before_install:
50− - HC=${CC}
51− - unset CC
52− - PATH=/opt/ghc/bin:/opt/ghc-ppa-tools/bin:$PATH
53−
54−install:
55− - cabal --version
56− - echo "$(${HC} --version) [$(${HC} --print-project-git-commit-id 2> /dev/null || echo '?')]"
57− - travis_retry cabal update -v
58− - sed -i 's/^jobs:/-- jobs:/' ${HOME}/.cabal/config
59−
60− - cabal new-build -w ${HC} --dep -j2 all
61−
62−# Here starts the actual work to be performed for the package under test;
63−# any command which exits with a non-zero exit code causes the build to fail.
64−script:
65− - cd uuid-types/
66− - cabal sdist
67− - cabal new-build -w ${HC} -j1
68− - cabal new-test -w ${HC}
69− - cd ..
70−
71− - cd uuid/
72− - cabal sdist
73− - cabal new-build -w ${HC} -j1
74− - cabal new-test -w ${HC}
75− - cd ..
76−
77−# EOF
cabal.bench.projectnew file+4
@@ -0,0 +1,4 @@
1+-- separate package for benchmarks
2+-- this way we can build criterion
3+packages: uuid-bench
4+benchmarks: True
cabal.haskell-cinew file+7
@@ -0,0 +1,7 @@
1+branches: 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+2−4
@@ -2,16 +2,14 @@
2-- for more details
2-- for more details
3
3
4packages: uuid-types/
4packages: uuid-types/
5− uuid/
5+packages: uuid/
6
6
7package uuid-types
7package uuid-types
8 tests: True
8 tests: True
9− benchmarks: True
10 -- profiling: True
9 -- profiling: True
11 -- profiling-detail: toplevel-functions
10 -- profiling-detail: toplevel-functions
12
11
13package uuid
12package uuid
14 tests: True
13 tests: True
15− benchmarks: True
16 -- profiling: True
14 -- profiling: True
17− -- profiling-detail: toplevel-functions
15+ -- profiling-detail: toplevel-functions
gen-ci.shnew file+5
@@ -0,0 +1,5 @@
1+#!/bin/sh
2+
3+# haskell-ci doesn't know how to regenerate multiple GHA workflows
4+haskell-ci github cabal.project
5+haskell-ci github --project cabal.bench.project -o .github/workflows/haskell-ci-bench.yml --github-action-name Benchmarks
uuid-bench/LICENSEnew file+28
@@ -0,0 +1,28 @@
1+Copyright (c) 2008, Antoine Latter
2+
3+All rights reserved.
4+
5+Redistribution and use in source and binary forms, with or without
6+modification, are permitted provided that the following conditions are
7+met:
8+
9+ * Redistributions of source code must retain the above copyright
10+notice, this list of conditions and the following disclaimer.
11+ * Redistributions in binary form must reproduce the above copyright
12+notice, this list of conditions and the following disclaimer in the
13+documentation and/or other materials provided with the distribution.
14+ * The names of the authors may not be used to endorse or promote
15+products derived from this software without specific prior written
16+permission.
17+
18+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
24+TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
25+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
26+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
27+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
uuid/tests/BenchUUID.hs → uuid-bench/bench/uuid-benchmark.hsrenamed−1
@@ -3,7 +3,6 @@ import Data.Char (ord)
3import Data.IORef
3import Data.IORef
4import Data.Word
4import Data.Word
5import qualified Data.UUID as U
5import qualified Data.UUID as U
6−import qualified Data.UUID.V1 as U
7import qualified Data.UUID.V4 as U
6import qualified Data.UUID.V4 as U
8import qualified Data.UUID.V3 as U3
7import qualified Data.UUID.V3 as U3
9import qualified Data.UUID.V5 as U5
8import qualified Data.UUID.V5 as U5
uuid-types/tests/BenchUUID.hs → uuid-bench/bench/uuid-types-benchmark.hsrenamed

The content is the same.

uuid-bench/src-uuidnew file+1
@@ -0,0 +1 @@
1+../uuid/src
uuid-bench/src-uuid-typesnew file+1
@@ -0,0 +1 @@
1+../uuid-types/src
uuid-bench/uuid-bench.cabalnew file+126
@@ -0,0 +1,126 @@
1+cabal-version: 1.12
2+name: uuid-bench
3+version: 0
4+copyright:
5+ (c) 2017-2018 Herbert Valerio Riedel
6+ (c) 2008-2014 Antoine Latter
7+
8+author: Antoine Latter
9+maintainer: Oleg Grenrus <oleg.grenrus@iki.fi>
10+license: BSD3
11+license-file: LICENSE
12+category: Data
13+build-type: Simple
14+
15+-- Benchmarking with older GHCs is not meaningful
16+tested-with:
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
26+
27+synopsis: UUID benchmarks
28+description:
29+ UUID benchmarks.
30+ This package is combined uuid and uuid-types, renamed so we do not
31+ cause benchmark tools to be build against local package.
32+
33+homepage: https://github.com/haskell-hvr/uuid
34+bug-reports: https://github.com/haskell-hvr/uuid/issues
35+
36+source-repository head
37+ type: git
38+ location: https://github.com/haskell-hvr/uuid.git
39+ subdir: uuid-bench
40+
41+library
42+ build-depends:
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
56+
57+ -- uuid modules
58+ exposed-modules:
59+ Data.UUID
60+ Data.UUID.Util
61+ Data.UUID.V3
62+ Data.UUID.V4
63+ Data.UUID.V5
64+
65+ other-modules:
66+ Data.UUID.Named
67+ Data.Word.Util
68+
69+ -- uuid-types modules
70+ exposed-modules: Data.UUID.Types
71+
72+ -- Exposed for companion projects; *NOT* part of the official API:
73+ exposed-modules:
74+ Data.UUID.Types.Internal
75+ Data.UUID.Types.Internal.Builder
76+
77+ default-language: Haskell2010
78+ other-extensions:
79+ DeriveDataTypeable
80+ TypeFamilies
81+
82+ ghc-options: -Wall
83+ hs-source-dirs: src-uuid-types src-uuid
84+
85+benchmark uuid-types-benchmark
86+ type: exitcode-stdio-1.0
87+ main-is: uuid-types-benchmark.hs
88+ hs-source-dirs: bench
89+ default-language: Haskell2010
90+ other-extensions: CPP
91+ ghc-options: -Wall
92+
93+ -- inherited constraints
94+ build-depends:
95+ base
96+ , bytestring
97+ , random
98+ , uuid-bench
99+
100+ -- deps w/o inherited constraints
101+ build-depends:
102+ containers >=0.5 && <0.8
103+ , criterion >=1.5 && <1.7
104+ , unordered-containers >=0.2.7 && <0.3
105+
106+benchmark uuid-benchmark
107+ type: exitcode-stdio-1.0
108+ main-is: uuid-benchmark.hs
109+ hs-source-dirs: bench
110+ default-language: Haskell2010
111+ default-extensions:
112+ CPP
113+ DeriveDataTypeable
114+
115+ ghc-options: -Wall -fno-warn-orphans
116+
117+ -- inherited constraints
118+ build-depends:
119+ base
120+ , random
121+ , uuid-bench
122+
123+ -- deps w/o inherited constraints
124+ build-depends:
125+ criterion >=1.5 && <1.7
126+ , 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+
1## 1.0.4.0
9## 1.0.4.0
2
10
3- Declare `Data.UUID.Types` module "`Trustworthy`" with respect to SafeHaskell.
11- Declare `Data.UUID.Types` module "`Trustworthy`" with respect to SafeHaskell.
4- Use more compact heap object representation which saves 16 bytes on 64bit platforms.
12- Use more compact heap object representation which saves 16 bytes on 64bit platforms.
5- Add `toWords64`/`fromWords64` functions
13- Add `toWords64`/`fromWords64` functions
6- Drop support for GHC < 7.
14- Drop support for GHC < 7.
15+- Add support for `random-1.2`, i.e. idiomatic `Random` and added `Uniform` instances.
7
16
8## 1.0.3
17## 1.0.3
9
18
uuid-types/cabal.projectnew file+1
@@ -0,0 +1 @@
1+packages: .
uuid-types/Data/UUID/Types.hs → uuid-types/src/Data/UUID/Types.hsrenamed−4
@@ -1,8 +1,4 @@
1−{-# LANGUAGE CPP #-}
2−
3−#if __GLASGOW_HASKELL__ >= 702
4{-# LANGUAGE Trustworthy #-}
1{-# LANGUAGE Trustworthy #-}
5−#endif
6
2
7{- |
3{- |
8Module : Data.UUID.Types
4Module : Data.UUID.Types
uuid-types/Data/UUID/Types/Internal.hs → uuid-types/src/Data/UUID/Types/Internal.hsrenamed+32−54
@@ -2,10 +2,9 @@
2{-# LANGUAGE DeriveDataTypeable #-}
2{-# LANGUAGE DeriveDataTypeable #-}
3{-# LANGUAGE TypeFamilies #-}
3{-# LANGUAGE TypeFamilies #-}
4{-# LANGUAGE ViewPatterns #-}
4{-# LANGUAGE ViewPatterns #-}
5−#if __GLASGOW_HASKELL__ >= 704
6{-# LANGUAGE Unsafe #-}
5{-# LANGUAGE Unsafe #-}
7−#endif
6+{-# LANGUAGE DeriveLift #-}
8−
7+{-# LANGUAGE StandaloneDeriving #-}
9{-# OPTIONS_HADDOCK hide #-}
8{-# OPTIONS_HADDOCK hide #-}
10
9
11-- |
10-- |
@@ -47,13 +46,11 @@ module Data.UUID.Types.Internal
47
46
48import Prelude hiding (null)
47import Prelude hiding (null)
49
48
50−import Control.Applicative ((<*>))
51import Control.DeepSeq (NFData (..))
49import Control.DeepSeq (NFData (..))
52import Control.Monad (guard, liftM2)
50import Control.Monad (guard, liftM2)
53import Data.Bits
51import Data.Bits
54import Data.Char
52import Data.Char
55import Data.Data
53import Data.Data
56−import Data.Functor ((<$>))
57import Data.Hashable
54import Data.Hashable
58import Data.List (elemIndices)
55import Data.List (elemIndices)
59import Foreign.Ptr (Ptr)
56import Foreign.Ptr (Ptr)
@@ -72,13 +69,15 @@ import qualified Data.Text.Encoding as T
72
69
73import Data.UUID.Types.Internal.Builder
70import Data.UUID.Types.Internal.Builder
74
71
75−import System.Random
72+import System.Random (Random (..), uniform)
73+import System.Random.Stateful (Uniform (..), uniformWord64)
76
74
75+import Language.Haskell.TH.Syntax (Lift)
77
76
78-- | Type representing <https://en.wikipedia.org/wiki/UUID Universally Unique Identifiers (UUID)> as specified in
77-- | Type representing <https://en.wikipedia.org/wiki/UUID Universally Unique Identifiers (UUID)> as specified in
79-- <http://tools.ietf.org/html/rfc4122 RFC 4122>.
78-- <http://tools.ietf.org/html/rfc4122 RFC 4122>.
80data UUID = UUID {-# UNPACK #-} !Word64 {-# UNPACK #-} !Word64
79data UUID = UUID {-# UNPACK #-} !Word64 {-# UNPACK #-} !Word64
81− deriving (Eq, Ord, Typeable)
80+ deriving (Eq, Ord)
82{-
81{-
83 Prior to uuid-types-1.0.4:
82 Prior to uuid-types-1.0.4:
84 !Word32 !Word32 !Word32 !Word32
83 !Word32 !Word32 !Word32 !Word32
@@ -334,19 +333,25 @@ fromString' s0 = do
334--
333--
335--
334--
336toString :: UUID -> String
335toString :: UUID -> String
337−toString uuid = hexw w0 $ hexw' w1 $ hexw' w2 $ hexw w3 ""
336+toString uuid = hexw0 w0 $ hexw1 w1 ""
338− where hexw :: Word32 -> String -> String
337+ where hexw0 :: Word64 -> String -> String
338+ hexw0 w s = hexn w 60 : hexn w 56 : hexn w 52 : hexn w 48
339+ : hexn w 44 : hexn w 40 : hexn w 36 : hexn w 32
339− hexw w s = hexn w 28 : hexn w 24 : hexn w 20 : hexn w 16
340+ : '-' : hexn w 28 : hexn w 24 : hexn w 20 : hexn w 16
340− : hexn w 12 : hexn w 8 : hexn w 4 : hexn w 0 : s
341+ : '-' : hexn w 12 : hexn w 8 : hexn w 4 : hexn w 0
341−
342+ : s
343+
342− hexw' :: Word32 -> String -> String
344+ hexw1 :: Word64 -> String -> String
343− hexw' w s = '-' : hexn w 28 : hexn w 24 : hexn w 20 : hexn w 16
345+ hexw1 w s = '-' : hexn w 60 : hexn w 56 : hexn w 52 : hexn w 48
346+ : '-' : hexn w 44 : hexn w 40 : hexn w 36 : hexn w 32
347+ : hexn w 28 : hexn w 24 : hexn w 20 : hexn w 16
344− : '-' : hexn w 12 : hexn w 8 : hexn w 4 : hexn w 0 : s
348+ : hexn w 12 : hexn w 8 : hexn w 4 : hexn w 0
345−
349+ : s
350+
346− hexn :: Word32 -> Int -> Char
351+ hexn :: Word64 -> Int -> Char
347 hexn w r = intToDigit $ fromIntegral ((w `shiftR` r) .&. 0xf)
352 hexn w r = intToDigit $ fromIntegral ((w `shiftR` r) .&. 0xf)
348
353
349− (w0,w1,w2,w3) = toWords uuid
354+ (w0,w1) = toWords64 uuid
350
355
351-- | If the passed in `Text` can be parsed as an ASCII representation of
356-- | If the passed in `Text` can be parsed as an ASCII representation of
352-- a `UUID`, it will be. The hyphens may not be omitted.
357-- a `UUID`, it will be. The hyphens may not be omitted.
@@ -450,23 +455,13 @@ fromASCIIBytes bs = do
450-- | Similar to `toASCIIBytes` except we produce a lazy `BL.ByteString`.
455-- | Similar to `toASCIIBytes` except we produce a lazy `BL.ByteString`.
451toLazyASCIIBytes :: UUID -> BL.ByteString
456toLazyASCIIBytes :: UUID -> BL.ByteString
452toLazyASCIIBytes =
457toLazyASCIIBytes =
453−#if MIN_VERSION_bytestring(0,10,0)
454 BL.fromStrict
458 BL.fromStrict
455−#else
456− BL.fromChunks . return
457−#endif
458 . toASCIIBytes
459 . toASCIIBytes
459
460
460-- | Similar to `fromASCIIBytes` except parses from a lazy `BL.ByteString`.
461-- | Similar to `fromASCIIBytes` except parses from a lazy `BL.ByteString`.
461fromLazyASCIIBytes :: BL.ByteString -> Maybe UUID
462fromLazyASCIIBytes :: BL.ByteString -> Maybe UUID
462fromLazyASCIIBytes bs =
463fromLazyASCIIBytes bs =
463− if BL.length bs == 36 then fromASCIIBytes (
464+ if BL.length bs == 36 then fromASCIIBytes (BL.toStrict bs) else Nothing
464−#if MIN_VERSION_bytestring(0,10,0)
465− BL.toStrict bs
466−#else
467− B.concat $ BL.toChunks bs
468−#endif
469− ) else Nothing
470
465
471--
466--
472-- Class Instances
467-- Class Instances
@@ -475,26 +470,15 @@ fromLazyASCIIBytes bs =
475-- | This 'Random' instance produces __insecure__ version 4 UUIDs as
470-- | This 'Random' instance produces __insecure__ version 4 UUIDs as
476-- specified in <http://tools.ietf.org/html/rfc4122 RFC 4122>.
471-- specified in <http://tools.ietf.org/html/rfc4122 RFC 4122>.
477instance Random UUID where
472instance Random UUID where
478− random g = (fromGenNext w0 w1 w2 w3 w4, g4)
473+ random = uniform
479− where (w0, g0) = next g
480− (w1, g1) = next g0
481− (w2, g2) = next g1
482− (w3, g3) = next g2
483− (w4, g4) = next g3
484 randomR _ = random -- range is ignored
474 randomR _ = random -- range is ignored
485
475
486−-- |Build a UUID from the results of five calls to next on a StdGen.
476+-- @since 1.0.4
487−-- While next on StdGet returns an Int, it doesn't provide 32 bits of
477+instance Uniform UUID where
488−-- randomness. This code relies on at last 28 bits of randomness in the
478+ uniformM gen = do
489−-- and optimizes its use so as to make only five random values, not six.
479+ w0 <- uniformWord64 gen
490−fromGenNext :: Int -> Int -> Int -> Int -> Int -> UUID
480+ w1 <- uniformWord64 gen
491−fromGenNext w0 w1 w2 w3 w4 =
492− buildFromBytes 4 /-/ (ThreeByte w0)
481+ pure $ buildFromBytes 4 /-/ w0 /-/ w1
493− /-/ (ThreeByte w1)
494− /-/ w2 -- use all 4 bytes because we know the version
495− -- field will "cover" the upper, non-random bits
496− /-/ (ThreeByte w3)
497− /-/ (ThreeByte w4)
498
482
499-- |A ByteSource to extract only three bytes from an Int, since next on StdGet
483-- |A ByteSource to extract only three bytes from an Int, since next on StdGet
500-- only returns 31 bits of randomness.
484-- only returns 31 bits of randomness.
@@ -588,10 +572,4 @@ instance Data UUID where
588uuidType :: DataType
572uuidType :: DataType
589uuidType = mkNoRepType "Data.UUID.Types.UUID"
573uuidType = mkNoRepType "Data.UUID.Types.UUID"
590
574
591−#if !MIN_VERSION_base(4,5,0)
575+deriving instance Lift UUID
592−unsafeShiftR, unsafeShiftL :: Bits w => w -> Int -> w
593−{-# INLINE unsafeShiftR #-}
594−unsafeShiftR = shiftR
595−{-# INLINE unsafeShiftL #-}
596−unsafeShiftL = shiftL
597−#endif
uuid-types/Data/UUID/Types/Internal/Builder.hs → uuid-types/src/Data/UUID/Types/Internal/Builder.hsrenamed−3
@@ -1,8 +1,5 @@
1−{-# LANGUAGE CPP #-}
2{-# LANGUAGE TypeFamilies #-}
1{-# LANGUAGE TypeFamilies #-}
3−#if __GLASGOW_HASKELL__ >= 704
4{-# LANGUAGE Unsafe #-}
2{-# LANGUAGE Unsafe #-}
5−#endif
6
3
7{-# OPTIONS_HADDOCK hide #-}
4{-# OPTIONS_HADDOCK hide #-}
8
5
uuid-types/tests/ByteOrder.hsdeleted−16
@@ -1,16 +0,0 @@
1−{-# LANGUAGE CPP #-}
2−
3−-- stolen from GHC.ByteOrder
4−module ByteOrder where
5−
6−#include "MachDeps.h"
7−
8−-- | Byte ordering.
9−data ByteOrder = BigEndian | LittleEndian deriving (Eq, Ord, Bounded, Enum, Read, Show)
10−
11−targetByteOrder :: ByteOrder
12−#if defined(WORDS_BIGENDIAN)
13−targetByteOrder = BigEndian
14−#else
15−targetByteOrder = LittleEndian
16−#endif
uuid-types/tests/TestUUID.hs+8−1
@@ -1,4 +1,5 @@
1{-# LANGUAGE ViewPatterns #-}
1{-# LANGUAGE ViewPatterns #-}
2+{-# LANGUAGE TemplateHaskell #-}
2
3
3{-# OPTIONS_GHC -fno-warn-orphans #-}
4{-# OPTIONS_GHC -fno-warn-orphans #-}
4
5
@@ -12,6 +13,7 @@ import qualified Data.UUID.Types as U
12import Data.Word
13import Data.Word
13import Foreign (alloca, castPtr, peek, poke,
14import Foreign (alloca, castPtr, peek, poke,
14 sizeOf)
15 sizeOf)
16+import GHC.ByteOrder (ByteOrder(..), targetByteOrder)
15import System.IO.Unsafe (unsafePerformIO)
17import System.IO.Unsafe (unsafePerformIO)
16
18
17import Test.QuickCheck (Arbitrary (arbitrary), choose)
19import Test.QuickCheck (Arbitrary (arbitrary), choose)
@@ -20,7 +22,6 @@ import Test.Tasty (TestTree, defaultMain, testGroup)
20import Test.Tasty.HUnit (assertBool, testCase, (@=?), (@?=))
22import Test.Tasty.HUnit (assertBool, testCase, (@=?), (@?=))
21import Test.Tasty.QuickCheck (testProperty)
23import Test.Tasty.QuickCheck (testProperty)
22
24
23−import ByteOrder
24
25
25-- orphan
26-- orphan
26instance Arbitrary U.UUID where
27instance Arbitrary U.UUID where
@@ -40,6 +41,11 @@ test_nil = testGroup "nil" [
40 testCase "nil bytes" $ U.toByteString U.nil @?= BL.pack (replicate 16 0)
41 testCase "nil bytes" $ U.toByteString U.nil @?= BL.pack (replicate 16 0)
41 ]
42 ]
42
43
44+test_lift :: Test
45+test_lift = testCase "TH.Lift" $ do
46+ let uuid = U.fromWords64 123456789 987654321
47+ uuid @?= $( [| uuid |] )
48+
43test_conv :: Test
49test_conv :: Test
44test_conv = testGroup "conversions" [
50test_conv = testGroup "conversions" [
45 testCase "conv bytes to string" $
51 testCase "conv bytes to string" $
@@ -176,6 +182,7 @@ main = do
176 [ [
182 [ [
177 test_null,
183 test_null,
178 test_nil,
184 test_nil,
185+ test_lift,
179 test_conv,
186 test_conv,
180 test_fromByteString,
187 test_fromByteString,
181 test_fromWords,
188 test_fromWords,
uuid-types/tests/summarize-bench-results.pldeleted−14
@@ -1,14 +0,0 @@
1−#!/usr/bin/env perl
2−
3−
4−while(<>) {
5− if (/^benchmarking (.*)$/) {
6− $name = $1;
7− }
8− if (/^mean:\s*([\d.]*) (\w*),/) {
9− $mean = 1 * $1;
10− $units = $2;
11−
12− printf "%-30s %10.2f %2s\n", $name, $mean, $units;
13− }
14−}
uuid-types/uuid-types.cabal+77−72
@@ -1,18 +1,30 @@
1−cabal-version: 1.12
1+cabal-version: 1.12
2−name: uuid-types
2+name: uuid-types
3−version: 1.0.4.0
3+version: 1.0.6
4+x-revision: 2
5+copyright:
6+ (c) 2017-2018 Herbert Valerio Riedel
7+ (c) 2008-2014 Antoine Latter
4
8
5−copyright: (c) 2017-2018 Herbert Valerio Riedel
6− (c) 2008-2014 Antoine Latter
7−author: Antoine Latter
9+author: Antoine Latter
8−maintainer: hvr@gnu.org
10+maintainer: Oleg Grenrus <oleg.grenrus@iki.fi>
9−license: BSD3
11+license: BSD3
10−license-file: LICENSE
12+license-file: LICENSE
11−category: Data
13+category: Data
12−build-type: Simple
14+build-type: Simple
13−tested-with: GHC==8.4.1, GHC==8.2.2, GHC==8.0.2, GHC==7.10.3, GHC==7.8.4, GHC==7.6.3, GHC==7.4.2
15+tested-with:
16+ GHC ==8.6.5
17+ || ==8.8.4
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
14
26
15−synopsis: Type definitions for Universally Unique Identifiers
27+synopsis: Type definitions for Universally Unique Identifiers
16description:
28description:
17 This library contains type definitions for
29 This library contains type definitions for
18 <https://en.wikipedia.org/wiki/UUID Universally Unique Identifiers (UUID)>
30 <https://en.wikipedia.org/wiki/UUID Universally Unique Identifiers (UUID)>
@@ -23,72 +35,65 @@ description:
23 See also the <https://hackage.haskell.org/package/uuid 'uuid' package>
35 See also the <https://hackage.haskell.org/package/uuid 'uuid' package>
24 providing a high-level API for managing the different UUID versions.
36 providing a high-level API for managing the different UUID versions.
25
37
26−homepage: https://github.com/hvr/uuid
38+homepage: https://github.com/haskell-hvr/uuid
27−bug-reports: https://github.com/hvr/uuid/issues
39+bug-reports: https://github.com/haskell-hvr/uuid/issues
28−
29−extra-source-files:
40+extra-source-files: ChangeLog.md
30− ChangeLog.md
31
41
32source-repository head
42source-repository head
33− type: git
43+ type: git
34− location: https://github.com/hvr/uuid.git
44+ location: https://github.com/haskell-hvr/uuid.git
35− subdir: uuid-types
45+ subdir: uuid-types
46+
47+library
48+ build-depends:
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
57+
58+ exposed-modules: Data.UUID.Types
36
59
37−Library
60+ -- Exposed for companion projects; *NOT* part of the official API:
38− build-depends: base >= 4.3 && < 5
61+ exposed-modules:
39− , binary >= 0.4 && < 0.9
62+ Data.UUID.Types.Internal
40− , bytestring >= 0.9 && < 0.11
63+ Data.UUID.Types.Internal.Builder
41− , deepseq >= 1.3 && < 1.5
42− , hashable (>= 1.1.1.0 && < 1.2)
43− || (>= 1.2.1 && < 1.3)
44− , random >= 1.0.1 && < 1.2
45− , text >= 1.2.3 && < 1.3
46
64
47− exposed-modules:
65+ default-language: Haskell2010
48− Data.UUID.Types
66+ other-extensions:
49− -- Exposed for companion projects; *NOT* part of the official API:
67+ DeriveDataTypeable
50− Data.UUID.Types.Internal.Builder
68+ TypeFamilies
51− Data.UUID.Types.Internal
52
69
53− default-language: Haskell2010
54− other-extensions: TypeFamilies
55− DeriveDataTypeable
56− ghc-options: -Wall
70+ ghc-options: -Wall
71+ hs-source-dirs: src
57
72
58test-suite testuuid
73test-suite testuuid
59− type: exitcode-stdio-1.0
74+ type: exitcode-stdio-1.0
60− main-is: TestUUID.hs
75+ main-is: TestUUID.hs
61− other-modules: ByteOrder
62− hs-source-dirs: tests
76+ hs-source-dirs: tests
63− default-language: Haskell2010
77+ default-language: Haskell2010
64− other-extensions: ViewPatterns
78+ other-extensions: ViewPatterns
65− ghc-options: -Wall
79+ ghc-options: -Wall
80+ if impl(ghc >= 8.10)
81+ ghc-options: -Wunused-packages
66
82
83+ -- inherited constraints
67− build-depends: uuid-types
84+ build-depends:
68− -- inherited constraints
69− , base
85+ base
70− , binary
86+ , binary
71− , bytestring
87+ , bytestring
72− -- deps w/o inherited constraints
88+ , template-haskell
73− , QuickCheck == 2.11.*
89+ , uuid-types
74− , tasty == 1.0.*
75− , tasty-hunit == 0.10.*
76− , tasty-quickcheck == 0.10.*
77
90
78−benchmark benchmark
91+ -- deps w/o inherited constraints
79− type: exitcode-stdio-1.0
92+ build-depends:
80− main-is: BenchUUID.hs
93+ QuickCheck >=2.14.2 && <2.16
81− hs-source-dirs: tests
94+ , tasty >=1.4.0.1 && <1.6
82− default-language: Haskell2010
95+ , tasty-hunit >=0.10 && <0.11
83− other-extensions: CPP
96+ , tasty-quickcheck >=0.10 && <0.12
84− ghc-options: -Wall
85
97
98+ if !impl(ghc >=8.4)
86− build-depends: uuid-types
99+ build-depends: ghc-byteorder >=4.11 && <4.12
87− -- inherited constraints
88− , base
89− , bytestring
90− , random
91− -- deps w/o inherited constraints
92− , containers >= 0.4 && < 0.6
93− , criterion == 1.4.*
94− , unordered-containers >= 0.2.7 && < 0.3
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+
11.3.13
141.3.13
2
15
3- Optimize `V4.nextRandom` (~3x speed increase)
16- Optimize `V4.nextRandom` (~3x speed increase)
4- Optimize UUID V3 & V5 generation (~2x speed increase)
17- Optimize UUID V3 & V5 generation (~2x speed increase)
5- Use `cryptohash-md5`/`cryptohash-sha1`/`entropy` instead
18- 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.
7- Update cabal-spec to version 1.10
21- Update cabal-spec to version 1.10
8
22
91.3.12
231.3.12
uuid/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 sepcified 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/Data/UUID.hs → uuid/src/Data/UUID.hsrenamed+2−3
@@ -18,9 +18,6 @@ See <http://tools.ietf.org/html/rfc4122> for the specification.
18favorite instance of 'System.Random.Random' for faster but insecure
18favorite instance of 'System.Random.Random' for faster but insecure
19generation of UUIDs.
19generation of UUIDs.
20
20
21−* We have an implementation of generating a UUID from the hardware
22−MAC address and current system time in "Data.UUID.V1".
23−
24* For name-based generation of UUIDs using SHA-1 hashing see
21* For name-based generation of UUIDs using SHA-1 hashing see
25"Data.UUID.V5".
22"Data.UUID.V5".
26-}
23-}
@@ -37,6 +34,8 @@ module Data.UUID(UUID
37 ,fromByteString
34 ,fromByteString
38 ,toWords
35 ,toWords
39 ,fromWords
36 ,fromWords
37+ ,toWords64
38+ ,fromWords64
40 ,null
39 ,null
41 ,nil
40 ,nil
42 ) where
41 ) where
uuid/Data/UUID/Named.hs → uuid/src/Data/UUID/Named.hsrenamed

The content is the same.

uuid/Data/UUID/Util.hs → uuid/src/Data/UUID/Util.hsrenamed−11
@@ -3,7 +3,6 @@ module Data.UUID.Util (
3 UnpackedUUID(..)
3 UnpackedUUID(..)
4 , unpack, pack
4 , unpack, pack
5 , version
5 , version
6− , extractMac
7 , extractTime
6 , extractTime
8 , setTime
7 , setTime
9 ) where
8 ) where
@@ -13,7 +12,6 @@ import Data.Word
13import Data.Word.Util
12import Data.Word.Util
14import Data.Bits
13import Data.Bits
15import Data.UUID.Types.Internal
14import Data.UUID.Types.Internal
16−import Network.Info
17import Data.Int (Int64)
15import Data.Int (Int64)
18
16
19version :: UUID -> Int
17version :: UUID -> Int
@@ -42,12 +40,3 @@ extractTime uuid =
42
40
43timeAndVersionToTime :: Word16 -> Word16
41timeAndVersionToTime :: Word16 -> Word16
44timeAndVersionToTime tv = tv .&. 0x0FFF
42timeAndVersionToTime 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/Data/UUID/V3.hs → uuid/src/Data/UUID/V3.hsrenamed+1−1
@@ -8,7 +8,7 @@ Maintainer : aslatter@gmail.com
8Stability : experimental
8Stability : experimental
9Portability : portable
9Portability : portable
10
10
11−NOTE: This module uses MD5 hashing. Unless you know
11+NOTE\: This module uses MD5 hashing. Unless you know
12you need to use this module, you should probably be
12you need to use this module, you should probably be
13using "Data.UUID.V5", which offers the same sort of
13using "Data.UUID.V5", which offers the same sort of
14functionality as this module except implemented with
14functionality as this module except implemented with
uuid/Data/UUID/V4.hs → uuid/src/Data/UUID/V4.hsrenamed+6−8
@@ -11,12 +11,9 @@
11 This module implements Version 4 UUIDs as specified
11 This module implements Version 4 UUIDs as specified
12 in RFC 4122.
12 in RFC 4122.
13
13
14− These UUIDs are generated from a psuedo-random generator.
14+ These UUIDs are generated from a pseudo-random generator.
15− We use the System.Random 'R.StdGen' as our random source.
15+ We use the 'getEntropy' method from the <https://hackage.haskell.org/package/entropy entropy> package,
16−
16+ which should provide cryptographically secure random data.
17− All of the logic is encapsulated in the 'R.Random' instance
18− for the UUID type, so you are also free to use the random generator
19− of your choice.
20-}
17-}
21module Data.UUID.V4 (nextRandom) where
18module Data.UUID.V4 (nextRandom) where
22
19
@@ -26,8 +23,9 @@ import Data.UUID.Types.Internal ( buildFromBytes )
26import System.Entropy ( getEntropy )
23import System.Entropy ( getEntropy )
27import Data.ByteString ( unpack )
24import Data.ByteString ( unpack )
28
25
29−-- | Generate a crytographically secure, random UUID. Introduced in version
26+-- | Generate a crytographically secure, random UUID.
27+--
30−-- 1.2.6.
28+-- @since 1.2.6
31nextRandom :: IO UUID
29nextRandom :: IO UUID
32nextRandom = do
30nextRandom = do
33 [b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, ba, bb, bc, bd, be, bf]
31 [b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, ba, bb, bc, bd, be, bf]
uuid/Data/UUID/V5.hs → uuid/src/Data/UUID/V5.hsrenamed

The content is the same.

uuid/Data/Word/Util.hs → uuid/src/Data/Word/Util.hsrenamed

The content is the same.

uuid/tests/TestUUID.hs+5−21
@@ -1,21 +1,18 @@
1{-# LANGUAGE ViewPatterns #-}
1{-# LANGUAGE ViewPatterns #-}
2
2
3−import Control.Monad (replicateM)
4import Data.Bits
3import Data.Bits
5import qualified Data.ByteString.Lazy as BL
4import qualified Data.ByteString.Lazy as BL
6import Data.Char (ord)
5import Data.Char (ord)
7−import Data.List (nub, (\\))
8import Data.Maybe
6import Data.Maybe
9import Data.Word
7import Data.Word
10import qualified Data.UUID as U
8import qualified Data.UUID as U
11−import qualified Data.UUID.V1 as U
12import qualified Data.UUID.V3 as U3
9import qualified Data.UUID.V3 as U3
13import qualified Data.UUID.V5 as U5
10import qualified Data.UUID.V5 as U5
14
11
15−import Test.QuickCheck ( Arbitrary(arbitrary), choose )
12+import Test.QuickCheck ( Arbitrary(arbitrary) )
16import Test.Tasty ( TestTree, testGroup, defaultMain )
13import Test.Tasty ( TestTree, testGroup, defaultMain )
17import Test.Tasty.HUnit
14import Test.Tasty.HUnit
18− ( Assertable(assert), assertBool, (@?=), testCase )
15+ ( assertBool, (@?=), testCase )
19import Test.Tasty.QuickCheck ( testProperty )
16import Test.Tasty.QuickCheck ( testProperty )
20
17
21type Test = TestTree
18type Test = TestTree
@@ -24,13 +21,13 @@ isValidVersion :: Int -> U.UUID -> Bool
24isValidVersion v u = lenOK && variantOK && versionOK
21isValidVersion v u = lenOK && variantOK && versionOK
25 where bs = U.toByteString u
22 where bs = U.toByteString u
26 lenOK = BL.length bs == 16
23 lenOK = BL.length bs == 16
27− variantOK = (BL.index bs 8) .&. 0xc0 == 0x80
24+ variantOK = BL.index bs 8 .&. 0xc0 == 0x80
28− versionOK = (BL.index bs 6) .&. 0xf0 == fromIntegral (v `shiftL` 4)
25+ versionOK = BL.index bs 6 .&. 0xf0 == fromIntegral (v `shiftL` 4)
29
26
30
27
31instance Arbitrary U.UUID where
28instance Arbitrary U.UUID where
32 -- the UUID random instance ignores bounds
29 -- the UUID random instance ignores bounds
33− arbitrary = choose (U.nil, U.nil)
30+ arbitrary = pure U.nil
34
31
35
32
36test_null :: Test
33test_null :: Test
@@ -38,17 +35,6 @@ test_null =
38 testCase "namespaceDNS is not null" $
35 testCase "namespaceDNS is not null" $
39 assertBool "" (not $ U.null U3.namespaceDNS)
36 assertBool "" (not $ U.null U3.namespaceDNS)
40
37
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− assert $ maybe False p u
51−
52test_v3 :: Test
38test_v3 :: Test
53test_v3 =
39test_v3 =
54 testCase "V3 computation" $
40 testCase "V3 computation" $
@@ -93,13 +79,11 @@ prop_v5Valid = testProperty "V5 valid" v5Valid
93
79
94main :: IO ()
80main :: IO ()
95main = do
81main = do
96− v1s <- replicateM 100 U.nextUUID
97 defaultMain $
82 defaultMain $
98 testGroup "tests" $
83 testGroup "tests" $
99 concat $
84 concat $
100 [ [
85 [ [
101 test_null,
86 test_null,
102− test_v1 v1s,
103 test_v3,
87 test_v3,
104 test_v5
88 test_v5
105 ]
89 ]
uuid/tests/summarize-bench-results.pldeleted−14
@@ -1,14 +0,0 @@
1−#!/usr/bin/env perl
2−
3−
4−while(<>) {
5− if (/^benchmarking (.*)$/) {
6− $name = $1;
7− }
8− if (/^mean:\s*([\d.]*) (\w*),/) {
9− $mean = 1 * $1;
10− $units = $2;
11−
12− printf "%-30s %10.2f %2s\n", $name, $mean, $units;
13− }
14−}
uuid/uuid.cabal+85−80
@@ -1,90 +1,95 @@
1+cabal-version: 1.12
1−Name: uuid
2+name: uuid
2−Version: 1.3.13
3+version: 1.3.16
4+x-revision: 2
3−Copyright: (c) 2008-2014 Antoine Latter
5+copyright: (c) 2008-2014 Antoine Latter
4−Author: Antoine Latter
6+author: Antoine Latter
5−Maintainer: hvr@gnu.org
7+maintainer: Oleg Grenrus <oleg.grenrus@iki.fi>
6−License: BSD3
8+license: BSD3
7−License-file: LICENSE
9+license-file: LICENSE
8−Category: Data
10+category: Data
9−Build-Type: Simple
11+build-type: Simple
10−Cabal-Version: >= 1.10
12+tested-with:
11−Tested-With: GHC==8.0.2, GHC==7.10.3, GHC==7.8.4, GHC==7.6.3, GHC==7.4.2
13+ GHC ==8.6.5
14+ || ==8.8.4
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
12
23
24+synopsis:
13−Synopsis: For creating, comparing, parsing and printing Universally Unique Identifiers
25+ For creating, comparing, parsing and printing Universally Unique Identifiers
14−Description:
15− This library is useful for creating, comparing, parsing and
16− printing Universally Unique Identifiers.
17− .
18− See <http://en.wikipedia.org/wiki/UUID> for the general idea.
19
26
20−Homepage: https://github.com/hvr/uuid
27+description:
21−Bug-Reports: https://github.com/hvr/uuid/issues
28+ This library is useful for creating, comparing, parsing and
29+ printing Universally Unique Identifiers.
30+ .
31+ See <http://en.wikipedia.org/wiki/UUID> for the general idea.
22
32
23−Extra-Source-Files:
33+homepage: https://github.com/haskell-hvr/uuid
34+bug-reports: https://github.com/haskell-hvr/uuid/issues
24− CHANGES.md
35+extra-source-files: CHANGES.md
25
36
26−Source-Repository head
37+source-repository head
27− Type: git
38+ type: git
28− Location: https://github.com/hvr/uuid.git
39+ location: https://github.com/haskell-hvr/uuid.git
29− Subdir: uuid
40+ subdir: uuid
30
41
31−Library
42+library
43+ build-depends:
32− Build-Depends: base >= 4.3 && < 5,
44+ base >=4.12 && <5
33− binary >= 0.4 && < 0.9,
45+ , binary >=0.8.6.0 && <0.9
34− bytestring >= 0.10 && < 0.11,
46+ , bytestring >=0.10.8.2 && <0.13
47+ , cryptohash-md5 >=0.11.100 && <0.12
35− cryptohash-sha1 >= 0.11.100 && < 0.12,
48+ , cryptohash-sha1 >=0.11.100 && <0.12
36− cryptohash-md5 >= 0.11.100 && < 0.12,
37− entropy >= 0.3.7 && < 0.4,
49+ , entropy >=0.3.7 && <0.5
38− network-info == 0.2.*,
39− random >= 1.0.1 && < 1.2,
40− time >= 1.1 && < 1.8,
41− text >= 1 && < 1.3,
42− uuid-types >= 1.0.2 && < 2
43
50
44− Exposed-Modules:
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
54+ exposed-modules:
45− Data.UUID
55+ Data.UUID
46− Data.UUID.Util
56+ Data.UUID.Util
47− Data.UUID.V1
48− Data.UUID.V3
57+ Data.UUID.V3
49− Data.UUID.V4
58+ Data.UUID.V4
50− Data.UUID.V5
59+ Data.UUID.V5
51
60
52− Other-Modules:
61+ other-modules:
53− Data.UUID.Named
62+ Data.UUID.Named
54− Data.Word.Util
63+ Data.Word.Util
55
64
56− Default-Language: Haskell2010
65+ default-language: Haskell2010
57− Default-Extensions: DeriveDataTypeable
66+ default-extensions: DeriveDataTypeable
58− Other-Extensions: TypeFamilies
67+ other-extensions: TypeFamilies
59− Ghc-Options: -Wall
68+ ghc-options: -Wall
69+ if impl(ghc >= 8.10)
70+ ghc-options: -Wunused-packages
71+ hs-source-dirs: src
60
72
61−Test-Suite testuuid
73+test-suite testuuid
62− Type: exitcode-stdio-1.0
74+ type: exitcode-stdio-1.0
63− Main-is: TestUUID.hs
75+ main-is: TestUUID.hs
64− Hs-source-dirs: tests
76+ hs-source-dirs: tests
65− Default-Language: Haskell2010
77+ default-language: Haskell2010
66− Default-Extensions: DeriveDataTypeable
78+ default-extensions: DeriveDataTypeable
67− Other-Extensions: ViewPatterns
79+ other-extensions: ViewPatterns
68− Ghc-Options: -Wall -fno-warn-orphans
80+ ghc-options: -Wall -fno-warn-orphans
69− Build-Depends: uuid
81+ if impl(ghc >= 8.10)
70− Build-Depends: base >= 4.3 && < 5,
82+ ghc-options: -Wunused-packages
71− bytestring >= 0.9 && < 0.11,
72− HUnit >= 1.2 && < 1.4,
73− QuickCheck >= 2.4 && < 2.10,
74− random >= 1.0.1 && < 1.2,
75− tasty >= 0.10 && < 0.12,
76− tasty-hunit == 0.9.*,
77− tasty-quickcheck == 0.8.*
78
83
79−benchmark benchmark
84+ -- inherited constraints
80− Type: exitcode-stdio-1.0
85+ build-depends:
81− Main-is: BenchUUID.hs
86+ base
82− Hs-source-dirs: tests
87+ , bytestring
83− Default-Language: Haskell2010
88+ , uuid
84− Default-Extensions: DeriveDataTypeable, CPP
89+
85− Ghc-Options: -Wall -fno-warn-orphans
90+ -- deps w/o inherited constraints
86− Build-Depends: uuid
91+ build-depends:
87− Build-Depends: base >= 4.3 && < 5,
92+ QuickCheck >=2.14.2 && <2.16
88− criterion >= 0.4 && < 1.2,
93+ , tasty >=1.4.0.1 && <1.6
89− mersenne-random-pure64 >= 0.2 && < 0.3,
94+ , tasty-hunit >=0.10 && <0.11
90− random >= 1.0.1 && < 1.2
95+ , tasty-quickcheck >=0.10 && <0.12