WWOXTYSKCYOBP6H7OQNLZJ22O6WVWCHQNJTHBRQ3ZEJH2KSQF3UAC "@opam/time_now@opam:v0.14.0@5e4046b3": {"id": "@opam/time_now@opam:v0.14.0@5e4046b3","name": "@opam/time_now","version": "opam:v0.14.0","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/md5/a9/a93116938783587f8b9f5152dd543037#md5:a93116938783587f8b9f5152dd543037","archive:https://ocaml.janestreet.com/ocaml-core/v0.14/files/time_now-v0.14.0.tar.gz#md5:a93116938783587f8b9f5152dd543037"],"opam": {"name": "time_now","version": "v0.14.0","path": "esy.lock/opam/time_now.v0.14.0"}},"overrides": [],"dependencies": ["ocaml@4.11.2000@d41d8cd9","@opam/ppx_optcomp@opam:v0.14.1@181fd1a0","@opam/ppx_base@opam:v0.14.0@b4702ed9","@opam/jst-config@opam:v0.14.0@d0d7469e","@opam/jane-street-headers@opam:v0.14.0@59432b6a","@opam/dune@opam:2.8.4@ee414d6c", "@opam/base@opam:v0.14.1@d14008e2","@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@4.11.2000@d41d8cd9","@opam/ppx_optcomp@opam:v0.14.1@181fd1a0","@opam/ppx_base@opam:v0.14.0@b4702ed9","@opam/jst-config@opam:v0.14.0@d0d7469e","@opam/jane-street-headers@opam:v0.14.0@59432b6a","@opam/dune@opam:2.8.4@ee414d6c", "@opam/base@opam:v0.14.1@d14008e2"]},
]},"@opam/sexplib@opam:v0.14.0@f67f18de": {"id": "@opam/sexplib@opam:v0.14.0@f67f18de","name": "@opam/sexplib","version": "opam:v0.14.0","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/md5/6e/6e230eae22face46cb8645e53e351067#md5:6e230eae22face46cb8645e53e351067","archive:https://ocaml.janestreet.com/ocaml-core/v0.14/files/sexplib-v0.14.0.tar.gz#md5:6e230eae22face46cb8645e53e351067"],"opam": {"name": "sexplib","version": "v0.14.0","path": "esy.lock/opam/sexplib.v0.14.0"}},"overrides": [],"dependencies": ["ocaml@4.11.2000@d41d8cd9", "@opam/sexplib0@opam:v0.14.0@ddeb6438","@opam/parsexp@opam:v0.14.0@c5bad87a", "@opam/num@opam:1.4@a5195c8d","@opam/dune@opam:2.8.4@ee414d6c", "@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@4.11.2000@d41d8cd9", "@opam/sexplib0@opam:v0.14.0@ddeb6438","@opam/parsexp@opam:v0.14.0@c5bad87a", "@opam/num@opam:1.4@a5195c8d","@opam/dune@opam:2.8.4@ee414d6c"
"@opam/dune@opam:2.8.4@ee414d6c", "@opam/base@opam:v0.14.1@d14008e2"]},"@opam/ppx_sexp_conv@opam:v0.14.3@1ee195f4": {"id": "@opam/ppx_sexp_conv@opam:v0.14.3@1ee195f4","name": "@opam/ppx_sexp_conv","version": "opam:v0.14.3","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/md5/25/25caf01245e0113e035ccefe275f85d9#md5:25caf01245e0113e035ccefe275f85d9","archive:https://github.com/janestreet/ppx_sexp_conv/archive/v0.14.3.tar.gz#md5:25caf01245e0113e035ccefe275f85d9"],"opam": {"name": "ppx_sexp_conv","version": "v0.14.3","path": "esy.lock/opam/ppx_sexp_conv.v0.14.3"}},"overrides": [],"dependencies": ["ocaml@4.11.2000@d41d8cd9", "@opam/sexplib0@opam:v0.14.0@ddeb6438","@opam/ppxlib@opam:0.22.0@d2d2223a","@opam/dune@opam:2.8.4@ee414d6c", "@opam/base@opam:v0.14.1@d14008e2","@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@4.11.2000@d41d8cd9", "@opam/sexplib0@opam:v0.14.0@ddeb6438","@opam/ppxlib@opam:0.22.0@d2d2223a",
"@opam/ppx_optcomp@opam:v0.14.1@181fd1a0": {"id": "@opam/ppx_optcomp@opam:v0.14.1@181fd1a0","name": "@opam/ppx_optcomp","version": "opam:v0.14.1","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/md5/4b/4ba24037b097bfedbbeb5a5c577694e1#md5:4ba24037b097bfedbbeb5a5c577694e1","archive:https://github.com/janestreet/ppx_optcomp/archive/v0.14.1.tar.gz#md5:4ba24037b097bfedbbeb5a5c577694e1"],"opam": {"name": "ppx_optcomp","version": "v0.14.1","path": "esy.lock/opam/ppx_optcomp.v0.14.1"}},"overrides": [],"dependencies": ["ocaml@4.11.2000@d41d8cd9", "@opam/stdio@opam:v0.14.0@a624e254","@opam/ppxlib@opam:0.22.0@d2d2223a","@opam/dune@opam:2.8.4@ee414d6c", "@opam/base@opam:v0.14.1@d14008e2","@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@4.11.2000@d41d8cd9", "@opam/stdio@opam:v0.14.0@a624e254","@opam/ppxlib@opam:0.22.0@d2d2223a","@opam/dune@opam:2.8.4@ee414d6c", "@opam/base@opam:v0.14.1@d14008e2"]},
"@opam/dune@opam:2.8.4@ee414d6c", "@opam/base@opam:v0.14.1@d14008e2"]},"@opam/ppx_inline_test@opam:v0.14.1@2e4fdd8d": {"id": "@opam/ppx_inline_test@opam:v0.14.1@2e4fdd8d","name": "@opam/ppx_inline_test","version": "opam:v0.14.1","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/md5/13/132754f0757188c3b700a2c5b6a2fb3f#md5:132754f0757188c3b700a2c5b6a2fb3f","archive:https://github.com/janestreet/ppx_inline_test/archive/v0.14.1.tar.gz#md5:132754f0757188c3b700a2c5b6a2fb3f"],"opam": {"name": "ppx_inline_test","version": "v0.14.1","path": "esy.lock/opam/ppx_inline_test.v0.14.1"}},"overrides": [],"dependencies": ["ocaml@4.11.2000@d41d8cd9", "@opam/time_now@opam:v0.14.0@5e4046b3","@opam/ppxlib@opam:0.22.0@d2d2223a","@opam/dune@opam:2.8.4@ee414d6c", "@opam/base@opam:v0.14.1@d14008e2","@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@4.11.2000@d41d8cd9", "@opam/time_now@opam:v0.14.0@5e4046b3","@opam/ppxlib@opam:0.22.0@d2d2223a",
"@opam/ppx_here@opam:v0.14.0@5ccc1c01": {"id": "@opam/ppx_here@opam:v0.14.0@5ccc1c01","name": "@opam/ppx_here","version": "opam:v0.14.0","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/md5/bb/bb3bbde0964a1f866de09f3df44def4d#md5:bb3bbde0964a1f866de09f3df44def4d","archive:https://ocaml.janestreet.com/ocaml-core/v0.14/files/ppx_here-v0.14.0.tar.gz#md5:bb3bbde0964a1f866de09f3df44def4d"],"opam": {"name": "ppx_here","version": "v0.14.0","path": "esy.lock/opam/ppx_here.v0.14.0"}},"overrides": [],"dependencies": ["ocaml@4.11.2000@d41d8cd9", "@opam/ppxlib@opam:0.22.0@d2d2223a","@opam/dune@opam:2.8.4@ee414d6c", "@opam/base@opam:v0.14.1@d14008e2","@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@4.11.2000@d41d8cd9", "@opam/ppxlib@opam:0.22.0@d2d2223a","@opam/dune@opam:2.8.4@ee414d6c", "@opam/base@opam:v0.14.1@d14008e2"]},"@opam/ppx_hash@opam:v0.14.0@8e9618e4": {"id": "@opam/ppx_hash@opam:v0.14.0@8e9618e4","name": "@opam/ppx_hash","version": "opam:v0.14.0","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/md5/b7/b78aee19bb4469731f9626b04fe7f341#md5:b78aee19bb4469731f9626b04fe7f341","archive:https://ocaml.janestreet.com/ocaml-core/v0.14/files/ppx_hash-v0.14.0.tar.gz#md5:b78aee19bb4469731f9626b04fe7f341"],"opam": {"name": "ppx_hash","version": "v0.14.0","path": "esy.lock/opam/ppx_hash.v0.14.0"}},"overrides": [],"dependencies": ["ocaml@4.11.2000@d41d8cd9", "@opam/ppxlib@opam:0.22.0@d2d2223a","@opam/ppx_sexp_conv@opam:v0.14.3@1ee195f4","@opam/ppx_compare@opam:v0.14.0@615de7a6","@opam/dune@opam:2.8.4@ee414d6c", "@opam/base@opam:v0.14.1@d14008e2","@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@4.11.2000@d41d8cd9", "@opam/ppxlib@opam:0.22.0@d2d2223a","@opam/ppx_sexp_conv@opam:v0.14.3@1ee195f4","@opam/ppx_compare@opam:v0.14.0@615de7a6","@opam/dune@opam:2.8.4@ee414d6c", "@opam/base@opam:v0.14.1@d14008e2"]},"@opam/ppx_expect@opam:v0.14.1@cee36131": {"id": "@opam/ppx_expect@opam:v0.14.1@cee36131","name": "@opam/ppx_expect","version": "opam:v0.14.1","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/md5/9c/9cc03dcabb00c72e17f7f5b0e4d28603#md5:9cc03dcabb00c72e17f7f5b0e4d28603","archive:https://github.com/janestreet/ppx_expect/archive/v0.14.1.tar.gz#md5:9cc03dcabb00c72e17f7f5b0e4d28603"],"opam": {"name": "ppx_expect","version": "v0.14.1","path": "esy.lock/opam/ppx_expect.v0.14.1"}},"overrides": [],"dependencies": ["ocaml@4.11.2000@d41d8cd9", "@opam/stdio@opam:v0.14.0@a624e254","@opam/re@opam:1.9.0@d4d5e13d", "@opam/ppxlib@opam:0.22.0@d2d2223a","@opam/ppx_inline_test@opam:v0.14.1@2e4fdd8d","@opam/ppx_here@opam:v0.14.0@5ccc1c01","@opam/dune@opam:2.8.4@ee414d6c", "@opam/base@opam:v0.14.1@d14008e2","@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@4.11.2000@d41d8cd9", "@opam/stdio@opam:v0.14.0@a624e254","@opam/re@opam:1.9.0@d4d5e13d", "@opam/ppxlib@opam:0.22.0@d2d2223a","@opam/ppx_inline_test@opam:v0.14.1@2e4fdd8d","@opam/ppx_here@opam:v0.14.0@5ccc1c01","@opam/dune@opam:2.8.4@ee414d6c", "@opam/base@opam:v0.14.1@d14008e2"]},"@opam/ppx_enumerate@opam:v0.14.0@63db8245": {"id": "@opam/ppx_enumerate@opam:v0.14.0@63db8245","name": "@opam/ppx_enumerate","version": "opam:v0.14.0","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/md5/18/188421af960759f6e45dd748f4f08e8d#md5:188421af960759f6e45dd748f4f08e8d","archive:https://ocaml.janestreet.com/ocaml-core/v0.14/files/ppx_enumerate-v0.14.0.tar.gz#md5:188421af960759f6e45dd748f4f08e8d"],"opam": {"name": "ppx_enumerate","version": "v0.14.0","path": "esy.lock/opam/ppx_enumerate.v0.14.0"}},"overrides": [],"dependencies": ["ocaml@4.11.2000@d41d8cd9", "@opam/ppxlib@opam:0.22.0@d2d2223a","@opam/dune@opam:2.8.4@ee414d6c", "@opam/base@opam:v0.14.1@d14008e2","@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@4.11.2000@d41d8cd9", "@opam/ppxlib@opam:0.22.0@d2d2223a","@opam/dune@opam:2.8.4@ee414d6c", "@opam/base@opam:v0.14.1@d14008e2"]},"@opam/ppx_deriving_yojson@opam:3.6.1@faf11a7c": {"id": "@opam/ppx_deriving_yojson@opam:3.6.1@faf11a7c","name": "@opam/ppx_deriving_yojson","version": "opam:3.6.1","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/sha256/71/712ee9207c70dd144e72cd689bee2d2beb120b804e77c74ec6f7b843a88944e6#sha256:712ee9207c70dd144e72cd689bee2d2beb120b804e77c74ec6f7b843a88944e6","archive:https://github.com/ocaml-ppx/ppx_deriving_yojson/releases/download/v3.6.1/ppx_deriving_yojson-v3.6.1.tbz#sha256:712ee9207c70dd144e72cd689bee2d2beb120b804e77c74ec6f7b843a88944e6"],"opam": {"name": "ppx_deriving_yojson","version": "3.6.1","path": "esy.lock/opam/ppx_deriving_yojson.3.6.1"}},"overrides": [],"dependencies": ["ocaml@4.11.2000@d41d8cd9", "@opam/yojson@opam:1.7.0@7056d985","@opam/result@opam:1.5@6b753c82","@opam/ppxlib@opam:0.22.0@d2d2223a","@opam/ppx_deriving@opam:5.2.1@479736f0","@opam/dune@opam:2.8.4@ee414d6c", "@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@4.11.2000@d41d8cd9", "@opam/yojson@opam:1.7.0@7056d985","@opam/result@opam:1.5@6b753c82","@opam/ppxlib@opam:0.22.0@d2d2223a","@opam/ppx_deriving@opam:5.2.1@479736f0","@opam/dune@opam:2.8.4@ee414d6c"]},
"@opam/ppx_compare@opam:v0.14.0@615de7a6": {"id": "@opam/ppx_compare@opam:v0.14.0@615de7a6","name": "@opam/ppx_compare","version": "opam:v0.14.0","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/md5/91/9149b3a0c954fe2cef2b0705d254b9e3#md5:9149b3a0c954fe2cef2b0705d254b9e3","archive:https://ocaml.janestreet.com/ocaml-core/v0.14/files/ppx_compare-v0.14.0.tar.gz#md5:9149b3a0c954fe2cef2b0705d254b9e3"],"opam": {"name": "ppx_compare","version": "v0.14.0","path": "esy.lock/opam/ppx_compare.v0.14.0"}},"overrides": [],"dependencies": ["ocaml@4.11.2000@d41d8cd9", "@opam/ppxlib@opam:0.22.0@d2d2223a","@opam/dune@opam:2.8.4@ee414d6c", "@opam/base@opam:v0.14.1@d14008e2","@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@4.11.2000@d41d8cd9", "@opam/ppxlib@opam:0.22.0@d2d2223a","@opam/dune@opam:2.8.4@ee414d6c", "@opam/base@opam:v0.14.1@d14008e2"]},"@opam/ppx_cold@opam:v0.14.0@345dec7c": {"id": "@opam/ppx_cold@opam:v0.14.0@345dec7c","name": "@opam/ppx_cold","version": "opam:v0.14.0","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/md5/6a/6a61807cd3b105b8c885bd2076986339#md5:6a61807cd3b105b8c885bd2076986339","archive:https://ocaml.janestreet.com/ocaml-core/v0.14/files/ppx_cold-v0.14.0.tar.gz#md5:6a61807cd3b105b8c885bd2076986339"],"opam": {"name": "ppx_cold","version": "v0.14.0","path": "esy.lock/opam/ppx_cold.v0.14.0"}},"overrides": [],"dependencies": ["ocaml@4.11.2000@d41d8cd9", "@opam/ppxlib@opam:0.22.0@d2d2223a","@opam/dune@opam:2.8.4@ee414d6c", "@opam/base@opam:v0.14.1@d14008e2","@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@4.11.2000@d41d8cd9", "@opam/ppxlib@opam:0.22.0@d2d2223a","@opam/dune@opam:2.8.4@ee414d6c", "@opam/base@opam:v0.14.1@d14008e2"]},
"@opam/ppx_base@opam:v0.14.0@b4702ed9": {"id": "@opam/ppx_base@opam:v0.14.0@b4702ed9","name": "@opam/ppx_base","version": "opam:v0.14.0","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/md5/b2/b29a24907e60f42e050ad90e5209bb92#md5:b29a24907e60f42e050ad90e5209bb92","archive:https://ocaml.janestreet.com/ocaml-core/v0.14/files/ppx_base-v0.14.0.tar.gz#md5:b29a24907e60f42e050ad90e5209bb92"],"opam": {"name": "ppx_base","version": "v0.14.0","path": "esy.lock/opam/ppx_base.v0.14.0"}},"overrides": [],"dependencies": ["ocaml@4.11.2000@d41d8cd9", "@opam/ppxlib@opam:0.22.0@d2d2223a","@opam/ppx_sexp_conv@opam:v0.14.3@1ee195f4","@opam/ppx_js_style@opam:v0.14.0@10b020a8","@opam/ppx_hash@opam:v0.14.0@8e9618e4","@opam/ppx_enumerate@opam:v0.14.0@63db8245","@opam/ppx_compare@opam:v0.14.0@615de7a6","@opam/ppx_cold@opam:v0.14.0@345dec7c","@opam/dune@opam:2.8.4@ee414d6c", "@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@4.11.2000@d41d8cd9", "@opam/ppxlib@opam:0.22.0@d2d2223a","@opam/ppx_sexp_conv@opam:v0.14.3@1ee195f4","@opam/ppx_js_style@opam:v0.14.0@10b020a8","@opam/ppx_hash@opam:v0.14.0@8e9618e4","@opam/ppx_enumerate@opam:v0.14.0@63db8245","@opam/ppx_compare@opam:v0.14.0@615de7a6","@opam/ppx_cold@opam:v0.14.0@345dec7c","@opam/dune@opam:2.8.4@ee414d6c"]},"@opam/ppx_assert@opam:v0.14.0@877b5900": {"id": "@opam/ppx_assert@opam:v0.14.0@877b5900","name": "@opam/ppx_assert","version": "opam:v0.14.0","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/md5/53/535b5f241eb7f10da8c044c26afbc186#md5:535b5f241eb7f10da8c044c26afbc186","archive:https://ocaml.janestreet.com/ocaml-core/v0.14/files/ppx_assert-v0.14.0.tar.gz#md5:535b5f241eb7f10da8c044c26afbc186"],"opam": {"name": "ppx_assert","version": "v0.14.0","path": "esy.lock/opam/ppx_assert.v0.14.0"}},"overrides": [],"dependencies": ["ocaml@4.11.2000@d41d8cd9", "@opam/ppxlib@opam:0.22.0@d2d2223a","@opam/ppx_sexp_conv@opam:v0.14.3@1ee195f4","@opam/ppx_here@opam:v0.14.0@5ccc1c01","@opam/ppx_compare@opam:v0.14.0@615de7a6","@opam/ppx_cold@opam:v0.14.0@345dec7c","@opam/dune@opam:2.8.4@ee414d6c", "@opam/base@opam:v0.14.1@d14008e2","@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@4.11.2000@d41d8cd9", "@opam/ppxlib@opam:0.22.0@d2d2223a","@opam/ppx_sexp_conv@opam:v0.14.3@1ee195f4","@opam/ppx_here@opam:v0.14.0@5ccc1c01","@opam/ppx_compare@opam:v0.14.0@615de7a6","@opam/ppx_cold@opam:v0.14.0@345dec7c","@opam/dune@opam:2.8.4@ee414d6c", "@opam/base@opam:v0.14.1@d14008e2"]},
]},"@opam/path_glob@opam:0.2@e298ab39": {"id": "@opam/path_glob@opam:0.2@e298ab39","name": "@opam/path_glob","version": "opam:0.2","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/sha256/5e/5e09a2148876b68ac8fb315679ba69b1e207ced55d91a3ea5b3046f917102a07#sha256:5e09a2148876b68ac8fb315679ba69b1e207ced55d91a3ea5b3046f917102a07","archive:https://gasche.gitlab.io/path_glob/releases/path_glob-0.2.tbz#sha256:5e09a2148876b68ac8fb315679ba69b1e207ced55d91a3ea5b3046f917102a07"],"opam": {"name": "path_glob","version": "0.2","path": "esy.lock/opam/path_glob.0.2"}},"overrides": [],"dependencies": ["ocaml@4.11.2000@d41d8cd9", "@opam/dune@opam:2.8.4@ee414d6c","@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@4.11.2000@d41d8cd9", "@opam/dune@opam:2.8.4@ee414d6c"
"@opam/parsexp@opam:v0.14.0@c5bad87a": {"id": "@opam/parsexp@opam:v0.14.0@c5bad87a","name": "@opam/parsexp","version": "opam:v0.14.0","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/md5/c2/c2c5fa3f9b082e4fe729e2cf95cacd3b#md5:c2c5fa3f9b082e4fe729e2cf95cacd3b","archive:https://ocaml.janestreet.com/ocaml-core/v0.14/files/parsexp-v0.14.0.tar.gz#md5:c2c5fa3f9b082e4fe729e2cf95cacd3b"],"opam": {"name": "parsexp","version": "v0.14.0","path": "esy.lock/opam/parsexp.v0.14.0"}},"overrides": [],"dependencies": ["ocaml@4.11.2000@d41d8cd9", "@opam/sexplib0@opam:v0.14.0@ddeb6438","@opam/dune@opam:2.8.4@ee414d6c", "@opam/base@opam:v0.14.1@d14008e2","@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@4.11.2000@d41d8cd9", "@opam/sexplib0@opam:v0.14.0@ddeb6438","@opam/dune@opam:2.8.4@ee414d6c", "@opam/base@opam:v0.14.1@d14008e2"]},
"archive:https://opam.ocaml.org/cache/sha256/fd/fd138e6c4fcff32c6d15eb66cc9391b7e1183717a6d1a47c688c7f6d320a159f#sha256:fd138e6c4fcff32c6d15eb66cc9391b7e1183717a6d1a47c688c7f6d320a159f","archive:https://github.com/ocaml/ocaml-lsp/releases/download/1.4.0/jsonrpc-1.4.0.tbz#sha256:fd138e6c4fcff32c6d15eb66cc9391b7e1183717a6d1a47c688c7f6d320a159f"
"archive:https://opam.ocaml.org/cache/sha256/ce/cee8371e7048e24c90e916c373ef6f3aba6f474d8a5fcf507ab6650fd8575eeb#sha256:cee8371e7048e24c90e916c373ef6f3aba6f474d8a5fcf507ab6650fd8575eeb","archive:https://github.com/ocaml/ocaml-lsp/releases/download/1.4.1/jsonrpc-1.4.1.tbz#sha256:cee8371e7048e24c90e916c373ef6f3aba6f474d8a5fcf507ab6650fd8575eeb"
"@opam/lwt_ppx@opam:2.0.2@d18729de": {"id": "@opam/lwt_ppx@opam:2.0.2@d18729de","name": "@opam/lwt_ppx","version": "opam:2.0.2","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/md5/fc/fc4721bdb1a01225b96e3a2debde95fa#md5:fc4721bdb1a01225b96e3a2debde95fa","archive:https://github.com/ocsigen/lwt/archive/5.4.0.zip#md5:fc4721bdb1a01225b96e3a2debde95fa"],"opam": {"name": "lwt_ppx","version": "2.0.2","path": "esy.lock/opam/lwt_ppx.2.0.2"}},"overrides": [],"dependencies": ["ocaml@4.11.2000@d41d8cd9", "@opam/ppxlib@opam:0.22.0@d2d2223a","@opam/lwt@opam:5.4.0@1ec6dbfd", "@opam/dune@opam:2.8.4@ee414d6c","@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@4.11.2000@d41d8cd9", "@opam/ppxlib@opam:0.22.0@d2d2223a","@opam/lwt@opam:5.4.0@1ec6dbfd", "@opam/dune@opam:2.8.4@ee414d6c"]},
"@opam/lru@opam:0.3.0@5f38669d": {"id": "@opam/lru@opam:0.3.0@5f38669d","name": "@opam/lru","version": "opam:0.3.0","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/md5/ec/ecaa8c9f5f708879140961ce35bcdba4#md5:ecaa8c9f5f708879140961ce35bcdba4","archive:https://github.com/pqwy/lru/releases/download/v0.3.0/lru-v0.3.0.tbz#md5:ecaa8c9f5f708879140961ce35bcdba4"],"opam": {"name": "lru","version": "0.3.0","path": "esy.lock/opam/lru.0.3.0"}},"overrides": [],"dependencies": ["ocaml@4.11.2000@d41d8cd9", "@opam/psq@opam:0.2.0@247756d4","@opam/dune@opam:2.8.4@ee414d6c", "@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@4.11.2000@d41d8cd9", "@opam/psq@opam:0.2.0@247756d4","@opam/dune@opam:2.8.4@ee414d6c"]},
]},"@opam/ke@opam:0.4@882968e4": {"id": "@opam/ke@opam:0.4@882968e4","name": "@opam/ke","version": "opam:0.4","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/sha256/dd/ddf60f66569b77c35c664087beb8934b3e43df1f70bccb6d4d02d70d8cef898d#sha256:ddf60f66569b77c35c664087beb8934b3e43df1f70bccb6d4d02d70d8cef898d","archive:https://github.com/mirage/ke/releases/download/v0.4/ke-v0.4.tbz#sha256:ddf60f66569b77c35c664087beb8934b3e43df1f70bccb6d4d02d70d8cef898d"],"opam": {"name": "ke","version": "0.4","path": "esy.lock/opam/ke.0.4"}},"overrides": [],"dependencies": ["ocaml@4.11.2000@d41d8cd9", "@opam/fmt@opam:0.8.9@e0843a5b","@opam/dune@opam:2.8.4@ee414d6c","@opam/bigarray-compat@opam:1.0.0@3a87ad65","@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@4.11.2000@d41d8cd9", "@opam/fmt@opam:0.8.9@e0843a5b","@opam/dune@opam:2.8.4@ee414d6c","@opam/bigarray-compat@opam:1.0.0@3a87ad65"]},"@opam/jst-config@opam:v0.14.0@d0d7469e": {"id": "@opam/jst-config@opam:v0.14.0@d0d7469e","name": "@opam/jst-config","version": "opam:v0.14.0","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/md5/ee/eefbac104a59bf90c82992cc9fb487d5#md5:eefbac104a59bf90c82992cc9fb487d5","archive:https://ocaml.janestreet.com/ocaml-core/v0.14/files/jst-config-v0.14.0.tar.gz#md5:eefbac104a59bf90c82992cc9fb487d5"],"opam": {"name": "jst-config","version": "v0.14.0","path": "esy.lock/opam/jst-config.v0.14.0"}},"overrides": [],"dependencies": ["ocaml@4.11.2000@d41d8cd9", "@opam/stdio@opam:v0.14.0@a624e254","@opam/ppx_assert@opam:v0.14.0@877b5900","@opam/dune-configurator@opam:2.8.4@5eab5258","@opam/dune@opam:2.8.4@ee414d6c", "@opam/base@opam:v0.14.1@d14008e2","@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@4.11.2000@d41d8cd9", "@opam/stdio@opam:v0.14.0@a624e254","@opam/ppx_assert@opam:v0.14.0@877b5900","@opam/dune-configurator@opam:2.8.4@5eab5258","@opam/dune@opam:2.8.4@ee414d6c", "@opam/base@opam:v0.14.1@d14008e2"]},"@opam/jane-street-headers@opam:v0.14.0@59432b6a": {"id": "@opam/jane-street-headers@opam:v0.14.0@59432b6a","name": "@opam/jane-street-headers","version": "opam:v0.14.0","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/md5/e8/e8d253ac44d25c8c66367153a0c77495#md5:e8d253ac44d25c8c66367153a0c77495","archive:https://ocaml.janestreet.com/ocaml-core/v0.14/files/jane-street-headers-v0.14.0.tar.gz#md5:e8d253ac44d25c8c66367153a0c77495"],"opam": {"name": "jane-street-headers","version": "v0.14.0","path": "esy.lock/opam/jane-street-headers.v0.14.0"}},"overrides": [],"dependencies": ["ocaml@4.11.2000@d41d8cd9", "@opam/dune@opam:2.8.4@ee414d6c","@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@4.11.2000@d41d8cd9", "@opam/dune@opam:2.8.4@ee414d6c"
"@opam/iter@opam:1.2.1@cf59a8b0": {"id": "@opam/iter@opam:1.2.1@cf59a8b0","name": "@opam/iter","version": "opam:1.2.1","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/md5/76/76f805c96d10f2649dd5c65b28052a82#md5:76f805c96d10f2649dd5c65b28052a82","archive:https://github.com/c-cube/iter/archive/1.2.1.tar.gz#md5:76f805c96d10f2649dd5c65b28052a82"],"opam": {"name": "iter","version": "1.2.1","path": "esy.lock/opam/iter.1.2.1"}},"overrides": [],"dependencies": ["ocaml@4.11.2000@d41d8cd9", "@opam/result@opam:1.5@6b753c82","@opam/dune-configurator@opam:2.8.4@5eab5258","@opam/dune@opam:2.8.4@ee414d6c","@opam/base-bytes@opam:base@19d0c2ff","@opam/base-bigarray@opam:base@b03491b0","@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@4.11.2000@d41d8cd9", "@opam/result@opam:1.5@6b753c82","@opam/dune-configurator@opam:2.8.4@5eab5258","@opam/dune@opam:2.8.4@ee414d6c","@opam/base-bytes@opam:base@19d0c2ff"]},
"@opam/earlybird@opam:1.0.3@b5ff1819": {"id": "@opam/earlybird@opam:1.0.3@b5ff1819","name": "@opam/earlybird","version": "opam:1.0.3","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/sha256/f1/f1a4de803d308eb2cb61bf9f8b0b77211d7526edd4a10753fc11dc3be754795f#sha256:f1a4de803d308eb2cb61bf9f8b0b77211d7526edd4a10753fc11dc3be754795f","archive:https://github.com/hackwaly/ocamlearlybird/releases/download/1.0.3/earlybird-1.0.3.tbz#sha256:f1a4de803d308eb2cb61bf9f8b0b77211d7526edd4a10753fc11dc3be754795f"],"opam": {"name": "earlybird","version": "1.0.3","path": "esy.lock/opam/earlybird.1.0.3"}},"overrides": [],"dependencies": ["ocaml@4.11.2000@d41d8cd9", "@opam/sexplib@opam:v0.14.0@f67f18de","@opam/ppx_deriving_yojson@opam:3.6.1@faf11a7c","@opam/ppx_deriving@opam:5.2.1@479736f0","@opam/path_glob@opam:0.2@e298ab39","@opam/menhirLib@opam:20210310@f9315713","@opam/menhir@opam:20210310@50de9216","@opam/lwt_react@opam:1.1.4@7d2054d1","@opam/lwt_ppx@opam:2.0.2@d18729de", "@opam/lwt@opam:5.4.0@1ec6dbfd","@opam/lru@opam:0.3.0@5f38669d", "@opam/logs@opam:0.7.0@1d03143e","@opam/iter@opam:1.2.1@cf59a8b0", "@opam/fmt@opam:0.8.9@e0843a5b","@opam/dune@opam:2.8.4@ee414d6c", "@opam/dap@opam:1.0.6@d7969661","@opam/csexp@opam:1.4.0@bd1cb034","@opam/cmdliner@opam:1.0.4@93208aac","@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@4.11.2000@d41d8cd9", "@opam/sexplib@opam:v0.14.0@f67f18de","@opam/ppx_deriving_yojson@opam:3.6.1@faf11a7c","@opam/ppx_deriving@opam:5.2.1@479736f0","@opam/path_glob@opam:0.2@e298ab39","@opam/menhirLib@opam:20210310@f9315713","@opam/lwt_react@opam:1.1.4@7d2054d1","@opam/lwt_ppx@opam:2.0.2@d18729de", "@opam/lwt@opam:5.4.0@1ec6dbfd","@opam/lru@opam:0.3.0@5f38669d", "@opam/logs@opam:0.7.0@1d03143e","@opam/iter@opam:1.2.1@cf59a8b0", "@opam/fmt@opam:0.8.9@e0843a5b","@opam/dune@opam:2.8.4@ee414d6c", "@opam/dap@opam:1.0.6@d7969661","@opam/csexp@opam:1.4.0@bd1cb034","@opam/cmdliner@opam:1.0.4@93208aac"]},
"@opam/dap@opam:1.0.6@d7969661": {"id": "@opam/dap@opam:1.0.6@d7969661","name": "@opam/dap","version": "opam:1.0.6","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/sha256/e0/e0b249a3e7382125402ad15d71f4924eef60cfcec326383a5168d424087200ff#sha256:e0b249a3e7382125402ad15d71f4924eef60cfcec326383a5168d424087200ff","archive:https://github.com/hackwaly/ocaml-dap/releases/download/1.0.6/dap-1.0.6.tbz#sha256:e0b249a3e7382125402ad15d71f4924eef60cfcec326383a5168d424087200ff"],"opam": {"name": "dap","version": "1.0.6","path": "esy.lock/opam/dap.1.0.6"}},"overrides": [],"dependencies": ["ocaml@4.11.2000@d41d8cd9", "@opam/yojson@opam:1.7.0@7056d985","@opam/react@opam:1.2.1@0e11855f","@opam/ppx_here@opam:v0.14.0@5ccc1c01","@opam/ppx_expect@opam:v0.14.1@cee36131","@opam/ppx_deriving_yojson@opam:3.6.1@faf11a7c","@opam/ppx_deriving@opam:5.2.1@479736f0","@opam/lwt_react@opam:1.1.4@7d2054d1","@opam/lwt_ppx@opam:2.0.2@d18729de", "@opam/lwt@opam:5.4.0@1ec6dbfd","@opam/logs@opam:0.7.0@1d03143e", "@opam/dune@opam:2.8.4@ee414d6c","@opam/angstrom-lwt-unix@opam:0.15.0@2ffc8053","@opam/angstrom@opam:0.15.0@48ede9cb","@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@4.11.2000@d41d8cd9", "@opam/yojson@opam:1.7.0@7056d985","@opam/react@opam:1.2.1@0e11855f","@opam/ppx_here@opam:v0.14.0@5ccc1c01","@opam/ppx_expect@opam:v0.14.1@cee36131","@opam/ppx_deriving_yojson@opam:3.6.1@faf11a7c","@opam/ppx_deriving@opam:5.2.1@479736f0","@opam/lwt_react@opam:1.1.4@7d2054d1","@opam/lwt_ppx@opam:2.0.2@d18729de", "@opam/lwt@opam:5.4.0@1ec6dbfd","@opam/logs@opam:0.7.0@1d03143e", "@opam/dune@opam:2.8.4@ee414d6c","@opam/angstrom-lwt-unix@opam:0.15.0@2ffc8053","@opam/angstrom@opam:0.15.0@48ede9cb"]},
opam-version: "2.0"synopsis: "Debug adapter protocol"description: """The Debug Adapter Protocol defines the protocol used between an editor or IDE and a debugger or runtime."""maintainer: "文宇祥 <hackwaly@qq.com>"authors: "文宇祥 <hackwaly@qq.com>"license: "MIT"homepage: "https://github.com/hackwaly/ocaml-dap"bug-reports: "https://github.com/hackwaly/ocaml-dap/issues"dev-repo: "git://git@github.com:hackwaly/ocaml-dap.git"doc: "https://hackwaly.github.io/ocaml-dap/"depends: ["ocaml" {>= "4.08"}"dune" {>= "2.7"}"yojson""ppx_here""ppx_deriving""ppx_deriving_yojson""ppx_expect""lwt""lwt_ppx""lwt_react""react""angstrom""angstrom-lwt-unix""logs"]build: [["dune" "subst"] {pinned}["dune" "build" "-p" name "-j" jobs]]x-commit-hash: "34cd793c049c7fb7bd7f78f80e1f36291aa60e70"url {src:"https://github.com/hackwaly/ocaml-dap/releases/download/1.0.6/dap-1.0.6.tbz"checksum: ["sha256=e0b249a3e7382125402ad15d71f4924eef60cfcec326383a5168d424087200ff""sha512=97805a383ad03ba24f1dabe20798c139678f958dfa2aed1664098f444aaeefd56d6dd7ff3650800eaefe5b17e09098427b78500316699e7267eb1fef233d6a99"]}
opam-version: "2.0"synopsis: "Debug adapter for OCaml 4.11"description: "Debug adapter for OCaml 4.11."maintainer: ["hackwaly@qq.com"]authors: ["hackwaly@qq.com"]homepage: "https://github.com/hackwaly/ocamlearlybird"bug-reports: "https://github.com/hackwaly/ocamlearlybird/issues"depends: ["dune" {>= "2.8"}"ocaml" {>= "4.11.0" & < "4.12.0"}"ppx_deriving" {>= "5.1"}"ppx_deriving_yojson" {>= "3.6.1"}"menhir" {>= "20201216" & build}"menhirLib" {>= "20201216"}"iter" {>= "1.2.1"}"lwt" {>= "5.4.0"}"lwt_ppx" {>= "2.0.1"}"lwt_react" {>= "1.1.3"}"cmdliner" {>= "1.0.4"}"logs" {>= "0.7.0"}"fmt" {>= "0.8.9"}"path_glob" {>= "0.2"}"sexplib" {>= "0.14.0"}"csexp" {>= "1.3.2"}"lru" {>= "0.3.0"}"dap" {>= "1.0.6"}"odoc" {with-doc}]build: [["dune" "subst"] {dev}["dune""build""-p"name"-j"jobs"@install""@runtest" {with-test}"@doc" {with-doc}]]dev-repo: "git+https://github.com/hackwaly/ocamlearlybird.git"x-commit-hash: "7bd4fb0275da4b2b08eeb7cd51668299ae46c6ab"url {src:"https://github.com/hackwaly/ocamlearlybird/releases/download/1.0.3/earlybird-1.0.3.tbz"checksum: ["sha256=f1a4de803d308eb2cb61bf9f8b0b77211d7526edd4a10753fc11dc3be754795f""sha512=335b431a94777d34dfccc619701521ddeb2df1af7de60273594b5d58a72121093189b711896a7d3580e55f26034a67d664ceb4b1386bbbfd4c1d8f1b5bf2b807"]}
opam-version: "2.0"synopsis: ""description:"Simple abstraction over `iter` functions, intended to iterate efficiently on collections while performing some transformations"maintainer: "simon.cruanes.2007@m4x.org"authors: ["Simon Cruanes" "Gabriel Radanne"]license: "BSD-2-Clause"tags: ["iter" "iterator" "iter" "fold"]homepage: "https://github.com/c-cube/iter/"doc: "https://c-cube.github.io/iter/doc/1.2"bug-reports: "https://github.com/c-cube/iter/issues"depends: ["ocaml""base-bytes""result""dune""dune-configurator""qcheck" {with-test}"qtest" {with-test}"mdx" {with-test}"odoc" {with-doc}]depopts: ["base-bigarray"]build: [["dune" "build" "@install" "-p" name "-j" jobs]["dune" "build" "@doc" "-p" name "-j" jobs] {with-doc}["dune" "runtest" "-p" name "-j" jobs] {with-test & ocaml:version >= "4.03.0"}]dev-repo: "git+https://github.com/c-cube/iter.git"url {src: "https://github.com/c-cube/iter/archive/1.2.1.tar.gz"checksum: ["md5=76f805c96d10f2649dd5c65b28052a82""sha512=f4c71a62fb2350e2cac78acf07abeb67c206f487101aa189b545e91a154d936cbe59092b6557ea516108b2faeabd034640d61450e99a2e930bd7559a6eee2675"]}
opam-version: "2.0"maintainer: "opensource@janestreet.com"authors: ["Jane Street Group, LLC <opensource@janestreet.com>"]homepage: "https://github.com/janestreet/jane-street-headers"bug-reports: "https://github.com/janestreet/jane-street-headers/issues"dev-repo: "git+https://github.com/janestreet/jane-street-headers.git"doc: "https://ocaml.janestreet.com/ocaml-core/latest/doc/jane-street-headers/index.html"license: "MIT"build: [["dune" "build" "-p" name "-j" jobs]]depends: ["ocaml" {>= "4.04.2"}"dune" {>= "2.0.0"}]synopsis: "Jane Street C header files"description: "C header files shared between the various Jane Street packages"url {src: "https://ocaml.janestreet.com/ocaml-core/v0.14/files/jane-street-headers-v0.14.0.tar.gz"checksum: "md5=e8d253ac44d25c8c66367153a0c77495"}
opam-version: "2.0"maintainer: "opensource@janestreet.com"authors: ["Jane Street Group, LLC <opensource@janestreet.com>"]homepage: "https://github.com/janestreet/jst-config"bug-reports: "https://github.com/janestreet/jst-config/issues"dev-repo: "git+https://github.com/janestreet/jst-config.git"doc: "https://ocaml.janestreet.com/ocaml-core/latest/doc/jst-config/index.html"license: "MIT"build: [["dune" "build" "-p" name "-j" jobs]]depends: ["ocaml" {>= "4.04.2"}"base" {>= "v0.14" & < "v0.15"}"ppx_assert" {>= "v0.14" & < "v0.15"}"stdio" {>= "v0.14" & < "v0.15"}"dune" {>= "2.0.0"}"dune-configurator"]synopsis: "Compile-time configuration for Jane Street libraries"description: "Defines compile-time constants used in Jane Street libraries such as Base, Core, andAsync.This package has an unstable interface; it is intended only to share configuration betweendifferent packages from Jane Street. Future updates may not be backward-compatible, and wedo not recommend using this package directly."url {src: "https://ocaml.janestreet.com/ocaml-core/v0.14/files/jst-config-v0.14.0.tar.gz"checksum: "md5=eefbac104a59bf90c82992cc9fb487d5"}
opam-version: "2.0"name: "ke"maintainer: "Romain Calascibetta <romain.calascibetta@gmail.com>"authors: "Romain Calascibetta <romain.calascibetta@gmail.com>"homepage: "https://github.com/mirage/ke"bug-reports: "https://github.com/mirage/ke/issues"dev-repo: "git+https://github.com/mirage/ke.git"doc: "https://mirage.github.io/ke/"license: "MIT"synopsis: "Queue implementation"description: """Queue implementation in OCaml (functional and imperative queue)"""build: [ "dune" "build" "-p" name "-j" jobs ]run-test: [ "dune" "runtest" "-p" name "-j" jobs ]depends: ["ocaml" {>= "4.03.0"}"dune""fmt""bigarray-compat""alcotest" {with-test}"bigstringaf" {with-test}]url {src: "https://github.com/mirage/ke/releases/download/v0.4/ke-v0.4.tbz"checksum: ["sha256=ddf60f66569b77c35c664087beb8934b3e43df1f70bccb6d4d02d70d8cef898d""sha512=3e4b9a30d2eb8af842b7953ba04ba64aadeafad807e098c203234924301e1b020b0fdf5f4f46e688c23058dacf5de86deae2c29e6874f4672cf990564cb9b8d3"]}
opam-version: "2.0"maintainer: "David Kaloper Meršinjak <dk505@cam.ac.uk>"authors: ["David Kaloper Meršinjak <dk505@cam.ac.uk>"]homepage: "https://github.com/pqwy/lru"doc: "https://pqwy.github.io/lru/doc"license: "ISC"dev-repo: "git+https://github.com/pqwy/lru.git"bug-reports: "https://github.com/pqwy/lru/issues"synopsis: "Scalable LRU caches"build: [ [ "dune" "subst" ] {pinned}[ "dune" "build" "-p" name "-j" jobs ][ "dune" "runtest" "-p" name ] {with-test} ]depends: ["ocaml" {>="4.03.0"}"dune" {>= "1.7"}"psq" {>="0.2.0"}"qcheck-core" {with-test}"qcheck-alcotest" {with-test}"alcotest" {with-test}]description: """Lru provides weight-bounded finite maps that can remove the least-recently-used(LRU) bindings in order to maintain a weight constraint."""url {src: "https://github.com/pqwy/lru/releases/download/v0.3.0/lru-v0.3.0.tbz"checksum: "md5=ecaa8c9f5f708879140961ce35bcdba4"}
opam-version: "2.0"synopsis:"PPX syntax for Lwt, providing something similar to async/await from JavaScript"maintainer: "Anton Bachin <antonbachin@yahoo.com>"authors: "Gabriel Radanne"license: "MIT"homepage: "https://github.com/ocsigen/lwt"doc: "https://ocsigen.org/lwt/dev/api/Ppx_lwt"bug-reports: "https://github.com/ocsigen/lwt/issues"depends: ["dune" {>= "1.8.0"}"lwt""ocaml" {>= "4.02.0"}"ppxlib" {>= "0.16.0"}]build: ["dune" "build" "-p" name "-j" jobs]dev-repo: "git+https://github.com/ocsigen/lwt.git"url {src: "https://github.com/ocsigen/lwt/archive/5.4.0.zip"checksum: ["md5=fc4721bdb1a01225b96e3a2debde95fa""sha512=e427f08223b77f9af696c9e6f90ff68e27e02e446910ef90d3da542e7b00bf23dd191ac77c1871288faa2289f8d28fc2f44efc3d3fe9165fe1c7a6be88ee49ff"]}
"sha256=fd138e6c4fcff32c6d15eb66cc9391b7e1183717a6d1a47c688c7f6d320a159f""sha512=567a73b3c10bb59c5a4d4e8291d1aeefdfd34438a95313fba8a485638294ca5fb8034334719631243c304d3328c27afa90dfd564fdb1e7390507a06db3a4ad03"
"sha256=cee8371e7048e24c90e916c373ef6f3aba6f474d8a5fcf507ab6650fd8575eeb""sha512=150ebf71d3484d3beec1a145877cf30d84581bd072dd20159e878ed07cc4fc647b019b98bb0c9fede839b87f7bd13de4a64b534c0760a2ec57d0e4a4deac6f0f"
opam-version: "2.0"maintainer: "opensource@janestreet.com"authors: ["Jane Street Group, LLC <opensource@janestreet.com>"]homepage: "https://github.com/janestreet/parsexp"bug-reports: "https://github.com/janestreet/parsexp/issues"dev-repo: "git+https://github.com/janestreet/parsexp.git"doc: "https://ocaml.janestreet.com/ocaml-core/latest/doc/parsexp/index.html"license: "MIT"build: [["dune" "build" "-p" name "-j" jobs]]depends: ["ocaml" {>= "4.04.2"}"base" {>= "v0.14" & < "v0.15"}"sexplib0" {>= "v0.14" & < "v0.15"}"dune" {>= "2.0.0"}]synopsis: "S-expression parsing library"description: "This library provides generic parsers for parsing S-expressions fromstrings or other medium.The library is focused on performances but still provide full genericparsers that can be used with strings, bigstrings, lexing buffers,character streams or any other sources effortlessly.It provides three different class of parsers:- the normal parsers, producing [Sexp.t] or [Sexp.t list] values- the parsers with positions, building compact position sequences sothat one can recover original positions in order to report properlylocated errors at little cost- the Concrete Syntax Tree parsers, produce values of type[Parsexp.Cst.t] which record the concrete layout of the s-expressionsyntax, including commentsThis library is portable and doesn't provide IO functions. To reads-expressions from files or other external sources, you should useparsexp_io."url {src: "https://ocaml.janestreet.com/ocaml-core/v0.14/files/parsexp-v0.14.0.tar.gz"checksum: "md5=c2c5fa3f9b082e4fe729e2cf95cacd3b"}
opam-version: "2.0"synopsis: "Globbing file paths"description: """An implementation of 'glob' patterns for file paths,extracted from ocamlbuild."""homepage: "https://gitlab.com/gasche/path_glob"bug-reports: "https://gitlab.com/gasche/path_glob/-/issues"doc: "https://gasche.gitlab.io/path_glob/doc/path_glob"dev-repo: "git+https://gitlab.com/gasche/path_glob.git"maintainer: ["Gabriel Scherer <gabriel.scherer@gmail.com>"]authors: ["Berke Durak"]license: "LGPL-2.0-only with OCaml-LGPL-linking-exception"depends: ["ocaml" {>= "4.03"}"dune" {>= "2.7"}"odoc" {with-doc}]build: [["dune" "subst"] {dev}["dune""build""-p"name"-j"jobs"@install""@runtest" {with-test}"@doc" {with-doc}]]x-commit-hash: "2cc5714fbe0439af7ba36eeff8b6d1acd437474b"url {src: "https://gasche.gitlab.io/path_glob/releases/path_glob-0.2.tbz"checksum: ["sha256=5e09a2148876b68ac8fb315679ba69b1e207ced55d91a3ea5b3046f917102a07""sha512=f55775c694e4b66acdfc9210cccc4af505ecbce3101b638495623d7f18a169e4c904e1b86c1c13ec3af9ae765acd6eedfa6cb7059a0c8a4a1aff375b7e9114ab"]}
opam-version: "2.0"maintainer: "opensource@janestreet.com"authors: ["Jane Street Group, LLC <opensource@janestreet.com>"]homepage: "https://github.com/janestreet/ppx_assert"bug-reports: "https://github.com/janestreet/ppx_assert/issues"dev-repo: "git+https://github.com/janestreet/ppx_assert.git"doc: "https://ocaml.janestreet.com/ocaml-core/latest/doc/ppx_assert/index.html"license: "MIT"build: [["dune" "build" "-p" name "-j" jobs]]depends: ["ocaml" {>= "4.04.2"}"base" {>= "v0.14" & < "v0.15"}"ppx_cold" {>= "v0.14" & < "v0.15"}"ppx_compare" {>= "v0.14" & < "v0.15"}"ppx_here" {>= "v0.14" & < "v0.15"}"ppx_sexp_conv" {>= "v0.14" & < "v0.15"}"dune" {>= "2.0.0"}"ppxlib" {>= "0.11.0"}]synopsis: "Assert-like extension nodes that raise useful errors on failure"description: "Part of the Jane Street's PPX rewriters collection."url {src: "https://ocaml.janestreet.com/ocaml-core/v0.14/files/ppx_assert-v0.14.0.tar.gz"checksum: "md5=535b5f241eb7f10da8c044c26afbc186"}
opam-version: "2.0"maintainer: "opensource@janestreet.com"authors: ["Jane Street Group, LLC <opensource@janestreet.com>"]homepage: "https://github.com/janestreet/ppx_base"bug-reports: "https://github.com/janestreet/ppx_base/issues"dev-repo: "git+https://github.com/janestreet/ppx_base.git"doc: "https://ocaml.janestreet.com/ocaml-core/latest/doc/ppx_base/index.html"license: "MIT"build: [["dune" "build" "-p" name "-j" jobs]]depends: ["ocaml" {>= "4.04.2"}"ppx_cold" {>= "v0.14" & < "v0.15"}"ppx_compare" {>= "v0.14" & < "v0.15"}"ppx_enumerate" {>= "v0.14" & < "v0.15"}"ppx_hash" {>= "v0.14" & < "v0.15"}"ppx_js_style" {>= "v0.14" & < "v0.15"}"ppx_sexp_conv" {>= "v0.14" & < "v0.15"}"dune" {>= "2.0.0"}"ppxlib" {>= "0.11.0"}]synopsis: "Base set of ppx rewriters"description: "ppx_base is the set of ppx rewriters used for Base.Note that Base doesn't need ppx to build, it is only used as averification tool."url {src: "https://ocaml.janestreet.com/ocaml-core/v0.14/files/ppx_base-v0.14.0.tar.gz"checksum: "md5=b29a24907e60f42e050ad90e5209bb92"}
opam-version: "2.0"maintainer: "opensource@janestreet.com"authors: ["Jane Street Group, LLC <opensource@janestreet.com>"]homepage: "https://github.com/janestreet/ppx_cold"bug-reports: "https://github.com/janestreet/ppx_cold/issues"dev-repo: "git+https://github.com/janestreet/ppx_cold.git"doc: "https://ocaml.janestreet.com/ocaml-core/latest/doc/ppx_cold/index.html"license: "MIT"build: [["dune" "build" "-p" name "-j" jobs]]depends: ["ocaml" {>= "4.04.2"}"base" {>= "v0.14" & < "v0.15"}"dune" {>= "2.0.0"}"ppxlib" {>= "0.11.0"}]synopsis: "Expands [@cold] into [@inline never][@specialise never][@local never]"description: "Part of the Jane Street's PPX rewriters collection."url {src: "https://ocaml.janestreet.com/ocaml-core/v0.14/files/ppx_cold-v0.14.0.tar.gz"checksum: "md5=6a61807cd3b105b8c885bd2076986339"}
opam-version: "2.0"maintainer: "opensource@janestreet.com"authors: ["Jane Street Group, LLC <opensource@janestreet.com>"]homepage: "https://github.com/janestreet/ppx_compare"bug-reports: "https://github.com/janestreet/ppx_compare/issues"dev-repo: "git+https://github.com/janestreet/ppx_compare.git"doc: "https://ocaml.janestreet.com/ocaml-core/latest/doc/ppx_compare/index.html"license: "MIT"build: [["dune" "build" "-p" name "-j" jobs]]depends: ["ocaml" {>= "4.04.2"}"base" {>= "v0.14" & < "v0.15"}"dune" {>= "2.0.0"}"ppxlib" {>= "0.11.0"}]synopsis: "Generation of comparison functions from types"description: "Part of the Jane Street's PPX rewriters collection."url {src: "https://ocaml.janestreet.com/ocaml-core/v0.14/files/ppx_compare-v0.14.0.tar.gz"checksum: "md5=9149b3a0c954fe2cef2b0705d254b9e3"}
opam-version: "2.0"maintainer: "whitequark <whitequark@whitequark.org>"authors: [ "whitequark <whitequark@whitequark.org>" ]license: "MIT"homepage: "https://github.com/ocaml-ppx/ppx_deriving_yojson"bug-reports: "https://github.com/ocaml-ppx/ppx_deriving_yojson/issues"dev-repo: "git+https://github.com/ocaml-ppx/ppx_deriving_yojson.git"tags: [ "syntax" "json" ]build: [["dune" "subst"] {dev}["dune" "build" "-p" name "-j" jobs]["dune" "runtest" "-p" name "-j" jobs] {with-test}]depends: ["ocaml" {>= "4.05.0"}"dune" {>= "1.0"}"yojson" {>= "1.6.0" & < "2.0.0"}"result""ppx_deriving" {>= "5.1"}"ppxlib" {>= "0.14.0"}"ounit" {with-test & >= "2.0.0"}]synopsis:"JSON codec generator for OCaml"description: """ppx_deriving_yojson is a ppx_deriving plugin that providesa JSON codec generator."""url {src:"https://github.com/ocaml-ppx/ppx_deriving_yojson/releases/download/v3.6.1/ppx_deriving_yojson-v3.6.1.tbz"checksum: ["sha256=712ee9207c70dd144e72cd689bee2d2beb120b804e77c74ec6f7b843a88944e6""sha512=d8c828902b8441f73e08fc03e2173ce81a09cccfe091471fbcffe098b2272739b98a05e8308016da3efeb3d4d1abd7d941bfaac42c85961ea40915ddce526577"]}x-commit-hash: "d0abe462de8bab52d763eeafd751e8ea1ba211ac"
opam-version: "2.0"maintainer: "opensource@janestreet.com"authors: ["Jane Street Group, LLC <opensource@janestreet.com>"]homepage: "https://github.com/janestreet/ppx_enumerate"bug-reports: "https://github.com/janestreet/ppx_enumerate/issues"dev-repo: "git+https://github.com/janestreet/ppx_enumerate.git"doc: "https://ocaml.janestreet.com/ocaml-core/latest/doc/ppx_enumerate/index.html"license: "MIT"build: [["dune" "build" "-p" name "-j" jobs]]depends: ["ocaml" {>= "4.04.2"}"base" {>= "v0.14" & < "v0.15"}"dune" {>= "2.0.0"}"ppxlib" {>= "0.11.0"}]synopsis: "Generate a list containing all values of a finite type"description: "Part of the Jane Street's PPX rewriters collection."url {src: "https://ocaml.janestreet.com/ocaml-core/v0.14/files/ppx_enumerate-v0.14.0.tar.gz"checksum: "md5=188421af960759f6e45dd748f4f08e8d"}
opam-version: "2.0"maintainer: "opensource@janestreet.com"authors: ["Jane Street Group, LLC <opensource@janestreet.com>"]homepage: "https://github.com/janestreet/ppx_expect"bug-reports: "https://github.com/janestreet/ppx_expect/issues"dev-repo: "git+https://github.com/janestreet/ppx_expect.git"doc: "https://ocaml.janestreet.com/ocaml-core/latest/doc/ppx_expect/index.html"license: "MIT"build: [["dune" "build" "-p" name "-j" jobs]]depends: ["ocaml" {>= "4.04.2"}"base" {>= "v0.14" & < "v0.15"}"ppx_here" {>= "v0.14" & < "v0.15"}"ppx_inline_test" {>= "v0.14" & < "v0.15"}"stdio" {>= "v0.14" & < "v0.15"}"dune" {>= "2.0.0"}"ppxlib" {>= "0.18.0"}"re" {>= "1.8.0"}]synopsis: "Cram like framework for OCaml"description: "Part of the Jane Street's PPX rewriters collection."url {src: "https://github.com/janestreet/ppx_expect/archive/v0.14.1.tar.gz"checksum: "md5=9cc03dcabb00c72e17f7f5b0e4d28603"}
opam-version: "2.0"maintainer: "opensource@janestreet.com"authors: ["Jane Street Group, LLC <opensource@janestreet.com>"]homepage: "https://github.com/janestreet/ppx_hash"bug-reports: "https://github.com/janestreet/ppx_hash/issues"dev-repo: "git+https://github.com/janestreet/ppx_hash.git"doc: "https://ocaml.janestreet.com/ocaml-core/latest/doc/ppx_hash/index.html"license: "MIT"build: [["dune" "build" "-p" name "-j" jobs]]depends: ["ocaml" {>= "4.04.2"}"base" {>= "v0.14" & < "v0.15"}"ppx_compare" {>= "v0.14" & < "v0.15"}"ppx_sexp_conv" {>= "v0.14" & < "v0.15"}"dune" {>= "2.0.0"}"ppxlib" {>= "0.11.0"}]synopsis: "A ppx rewriter that generates hash functions from type expressions and definitions"description: "Part of the Jane Street's PPX rewriters collection."url {src: "https://ocaml.janestreet.com/ocaml-core/v0.14/files/ppx_hash-v0.14.0.tar.gz"checksum: "md5=b78aee19bb4469731f9626b04fe7f341"}
opam-version: "2.0"maintainer: "opensource@janestreet.com"authors: ["Jane Street Group, LLC <opensource@janestreet.com>"]homepage: "https://github.com/janestreet/ppx_here"bug-reports: "https://github.com/janestreet/ppx_here/issues"dev-repo: "git+https://github.com/janestreet/ppx_here.git"doc: "https://ocaml.janestreet.com/ocaml-core/latest/doc/ppx_here/index.html"license: "MIT"build: [["dune" "build" "-p" name "-j" jobs]]depends: ["ocaml" {>= "4.04.2"}"base" {>= "v0.14" & < "v0.15"}"dune" {>= "2.0.0"}"ppxlib" {>= "0.11.0"}]synopsis: "Expands [%here] into its location"description: "Part of the Jane Street's PPX rewriters collection."url {src: "https://ocaml.janestreet.com/ocaml-core/v0.14/files/ppx_here-v0.14.0.tar.gz"checksum: "md5=bb3bbde0964a1f866de09f3df44def4d"}
opam-version: "2.0"maintainer: "opensource@janestreet.com"authors: ["Jane Street Group, LLC <opensource@janestreet.com>"]homepage: "https://github.com/janestreet/ppx_inline_test"bug-reports: "https://github.com/janestreet/ppx_inline_test/issues"dev-repo: "git+https://github.com/janestreet/ppx_inline_test.git"doc: "https://ocaml.janestreet.com/ocaml-core/latest/doc/ppx_inline_test/index.html"license: "MIT"build: [["dune" "build" "-p" name "-j" jobs]]depends: ["ocaml" {>= "4.04.2"}"base" {>= "v0.14" & < "v0.15"}"time_now" {>= "v0.14" & < "v0.15"}"dune" {>= "2.0.0"}"ppxlib" {>= "0.14.0"}]synopsis: "Syntax extension for writing in-line tests in ocaml code"description: "Part of the Jane Street's PPX rewriters collection."url {src: "https://github.com/janestreet/ppx_inline_test/archive/v0.14.1.tar.gz"checksum: "md5=132754f0757188c3b700a2c5b6a2fb3f"}
opam-version: "2.0"maintainer: "opensource@janestreet.com"authors: ["Jane Street Group, LLC <opensource@janestreet.com>"]homepage: "https://github.com/janestreet/ppx_optcomp"bug-reports: "https://github.com/janestreet/ppx_optcomp/issues"dev-repo: "git+https://github.com/janestreet/ppx_optcomp.git"doc: "https://ocaml.janestreet.com/ocaml-core/latest/doc/ppx_optcomp/index.html"license: "MIT"build: [["dune" "build" "-p" name "-j" jobs]]depends: ["ocaml" {>= "4.04.2"}"base" {>= "v0.14" & < "v0.15"}"stdio" {>= "v0.14" & < "v0.15"}"dune" {>= "2.0.0"}"ppxlib" {>= "0.18.0"}]synopsis: "Optional compilation for OCaml"description: "Part of the Jane Street's PPX rewriters collection."url {src: "https://github.com/janestreet/ppx_optcomp/archive/v0.14.1.tar.gz"checksum: "md5=4ba24037b097bfedbbeb5a5c577694e1"}
opam-version: "2.0"maintainer: "opensource@janestreet.com"authors: ["Jane Street Group, LLC <opensource@janestreet.com>"]homepage: "https://github.com/janestreet/ppx_sexp_conv"bug-reports: "https://github.com/janestreet/ppx_sexp_conv/issues"dev-repo: "git+https://github.com/janestreet/ppx_sexp_conv.git"doc: "https://ocaml.janestreet.com/ocaml-core/latest/doc/ppx_sexp_conv/index.html"license: "MIT"build: [["dune" "build" "-p" name "-j" jobs]]depends: ["ocaml" {>= "4.04.2"}"base" {>= "v0.14" & < "v0.15"}"sexplib0" {>= "v0.14" & < "v0.15"}"dune" {>= "2.0.0"}"ppxlib" {>= "0.22.0"}]synopsis: "[@@deriving] plugin to generate S-expression conversion functions"description: "Part of the Jane Street's PPX rewriters collection."url {src: "https://github.com/janestreet/ppx_sexp_conv/archive/v0.14.3.tar.gz"checksum: "md5=25caf01245e0113e035ccefe275f85d9"}
opam-version: "2.0"maintainer: "opensource@janestreet.com"authors: ["Jane Street Group, LLC <opensource@janestreet.com>"]homepage: "https://github.com/janestreet/sexplib"bug-reports: "https://github.com/janestreet/sexplib/issues"dev-repo: "git+https://github.com/janestreet/sexplib.git"doc: "https://ocaml.janestreet.com/ocaml-core/latest/doc/sexplib/index.html"license: "MIT"build: [["dune" "build" "-p" name "-j" jobs]]depends: ["ocaml" {>= "4.04.2"}"parsexp" {>= "v0.14" & < "v0.15"}"sexplib0" {>= "v0.14" & < "v0.15"}"dune" {>= "2.0.0"}"num"]synopsis: "Library for serializing OCaml values to and from S-expressions"description: "Part of Jane Street's Core libraryThe Core suite of libraries is an industrial strength alternative toOCaml's standard library that was developed by Jane Street, thelargest industrial user of OCaml."url {src: "https://ocaml.janestreet.com/ocaml-core/v0.14/files/sexplib-v0.14.0.tar.gz"checksum: "md5=6e230eae22face46cb8645e53e351067"}
opam-version: "2.0"maintainer: "opensource@janestreet.com"authors: ["Jane Street Group, LLC <opensource@janestreet.com>"]homepage: "https://github.com/janestreet/time_now"bug-reports: "https://github.com/janestreet/time_now/issues"dev-repo: "git+https://github.com/janestreet/time_now.git"doc: "https://ocaml.janestreet.com/ocaml-core/latest/doc/time_now/index.html"license: "MIT"build: [["dune" "build" "-p" name "-j" jobs]]depends: ["ocaml" {>= "4.04.2"}"base" {>= "v0.14" & < "v0.15"}"jane-street-headers" {>= "v0.14" & < "v0.15"}"jst-config" {>= "v0.14" & < "v0.15"}"ppx_base" {>= "v0.14" & < "v0.15"}"ppx_optcomp" {>= "v0.14" & < "v0.15"}"dune" {>= "2.0.0"}]synopsis: "Reports the current time"description: "Provides a single function to report the current time in nanosecondssince the start of the Unix epoch."url {src: "https://ocaml.janestreet.com/ocaml-core/v0.14/files/time_now-v0.14.0.tar.gz"checksum: "md5=a93116938783587f8b9f5152dd543037"}
(library(name Opus_c)(public_name opus.c)(modules opus_c ffi_stubs_gen)(wrapped false)(libraries ctypes opus.c.ffi)(c_library_flags(:standard(:include c_library_flags.sexp)))(foreign_stubs(language c)(names ffi_stubs_gen)(flags(:standard(:include c_flags.sexp)))))(rule(targets c_flags.sexp c_library_flags.sexp c_flags.lines)(deps(:discover config/discover.exe))(action(run %{discover})))(library(name Types_stubs)(public_name opus.cstubs.types)(modules types_stubs)(libraries ctypes))(executable(name gen_types)(modules gen_types)(libraries ctypes.stubs opus.cstubs.types))(rule(targets types_gen.c)(deps(:gen ./gen_types.exe))(action(run %{gen} %{targets})))(rule(targets types_stubs_gen.exe)(deps(:c ./types_gen.c)c_flags.lines)(action(bash"%{cc} %{c} -I %{lib:ctypes:.} -I %{ocaml_where} %{read-lines:c_flags.lines} -o %{targets}")))(rule(with-stdout-totypes_stubs_gen.ml(run ./types_stubs_gen.exe)))(library(name Ffi_stubs)(public_name opus.c.ffi)(modules Types_stubs_gen Ffi_stubs Opus_c_types)(flags(:standard -w -9-16-27))(libraries ctypes opus.cstubs.types))(executable(name gen_ffi)(modules gen_ffi)(libraries ctypes.stubs opus.c.ffi))(rule(targets ffi_stubs_gen.c ffi_stubs_gen.ml)(deps(:gen ./gen_ffi.exe))(action(run %{gen} %{targets})))
module T = Opus_c_typesmodule Def (F : Ctypes.FOREIGN) = structopen Ctypesopen Fmodule Types = Opus_c_typesmodule Error = structlet to_string = foreign "opus_strerror" (T.Error.t @-> returning string)endmodule Encoder = structlet get_size = foreign "opus_encoder_get_size" (int @-> returning int)let init = foreign "opus_encoder_init" (ptr void @-> int32_t @-> int @-> int @-> returning T.Error.t)let create = foreign "opus_encoder_create" (int32_t @-> int @-> int @-> ptr T.Error.t @-> returning T.Encoder.t)let destroy = foreign "opus_encoder_destroy" (T.Encoder.t @-> returning void)let encode = foreign "opus_encode" (T.Encoder.t @-> ptr int16_t @-> int @-> ptr uchar @-> int @-> returning int)let encode_float = foreign "opus_encode_float" (T.Encoder.t @-> ptr float @-> int @-> ptr uchar @-> int @-> returning int)endmodule Decoder = structlet get_size = foreign "opus_decoder_get_size" (int @-> returning int)let init = foreign "opus_decoder_init" (ptr void @-> int32_t @-> int @-> returning T.Error.t)let create = foreign "opus_decoder_create" (int32_t @-> int @-> ptr T.Error.t @-> returning T.Decoder.t)let destroy = foreign "opus_decoder_destroy" (T.Decoder.t @-> returning void)let decode = foreign "opus_decode" (T.Decoder.t @-> ptr uchar @-> int32_t @-> ptr int16_t @-> int @-> bool @-> returning int)let decode_float = foreign "opus_decode_float" (T.Decoder.t @-> ptr uchar @-> int32_t @-> ptr float @-> int @-> bool @-> returning int)endend
let c_headers = {|#include <opus.h>#include <opus_multistream.h>|}let write_stub fname =let oc = open_out_bin fname inlet ext = Filename.extension fname inlet format = Format.formatter_of_out_channel oc inlet fn = match ext with| "" | ".ml" -> Cstubs.write_ml| ".c" ->Format.fprintf format "%s@\n" c_headers;Cstubs.write_c| _ -> failwith "invalid stub extension: must be either `.c` or `.ml`(default)"infn ~concurrency:Cstubs.unlocked format ~prefix:"opus_stubs" (module Ffi_stubs.Def);Format.pp_print_flush format ();close_out oclet () =Sys.argv |> Array.to_list |> List.tl |> List.iter write_stub
let c_headers = {|#include <opus.h>#include <opus_multistream.h>|}let () =let fname = Sys.argv.(1) inlet oc = open_out_bin fname inlet format =Format.formatter_of_out_channel ocinFormat.fprintf format "%s@\n" c_headers;Cstubs.Types.write_c format (module Types_stubs.Def);Format.pp_print_flush format ();close_out oc
include Ffi_stubs.Def (Ffi_stubs_gen)
include Types_stubs.Def (Types_stubs_gen)
module Def (F : Cstubs_structs.TYPE) = structopen Ctypesopen Fmodule Error = structlet t = intlet alloc_fail = constant "OPUS_ALLOC_FAIL" intlet invalid_state = constant "OPUS_INVALID_STATE" intlet unimplemented = constant "OPUS_UNIMPLEMENTED" intlet invalid_packet = constant "OPUS_INVALID_PACKET" intlet internal_error = constant "OPUS_INTERNAL_ERROR" intlet buffer_too_small = constant "OPUS_BUFFER_TOO_SMALL" intlet bad_arg = constant "OPUS_BAD_ARG" intlet ok = constant "OPUS_OK" inttype t = [`Alloc_fail| `Invalid_state| `Unimplemented| `Invalid_packet| `Internal_error| `Buffer_too_small| `Bad_arg| `Unknown of int ]let of_c = function| e when e = ok -> raise (Invalid_argument "not an error")| e when e = alloc_fail -> `Alloc_fail| e when e = invalid_state -> `Invalid_state| e when e = unimplemented -> `Unimplemented| e when e = invalid_packet -> `Invalid_packet| e when e = internal_error -> `Internal_error| e when e = buffer_too_small -> `Buffer_too_small| e when e = bad_arg -> `Bad_arg| other -> `Unknown otherlet of_c_opt e =match of_c e with| err -> Some err| exception Invalid_argument _ -> Noneendlet auto = constant "OPUS_AUTO" intmodule Application = structlet voip = constant "OPUS_APPLICATION_VOIP" intlet audio = constant "OPUS_APPLICATION_AUDIO" intlet restricted_lowedelay = constant "OPUS_APPLICATION_RESTRICTED_LOWDELAY" inttype t = [| `Voip| `Audio| `Restricted_lowdelay]let to_c = function| `Voip -> voip| `Audio -> audio| `Restricted_lowdelay -> restricted_lowedelaylet of_c = function| n when n = voip -> `Voip| n when n = audio -> `Audio| n when n = restricted_lowedelay -> `Restricted_lowdelay| _ -> assert falseendmodule Signal = structlet voice = constant "OPUS_SIGNAL_VOICE" intlet music = constant "OPUS_SIGNAL_MUSIC" inttype t = [| `Voice| `Music]let of_c = function| n when n = voice -> `Voice| n when n = music -> `Music| _ -> assert falselet to_c = function| `Voice -> voice| `Music -> musicendmodule Bitrate = structlet max = constant "OPUS_BITRATE_MAX" inttype t = [| `Max| `Bps of int]let of_c = function| n when n = max -> `Max| n -> `Bps nlet to_c = function| `Max -> max| `Bps bps -> bpsendmodule Bandwidth = structlet narrowband = constant "OPUS_BANDWIDTH_NARROWBAND" intlet mediumband = constant "OPUS_BANDWIDTH_MEDIUMBAND" intlet wideband = constant "OPUS_BANDWIDTH_WIDEBAND" intlet superwideband = constant "OPUS_BANDWIDTH_SUPERWIDEBAND" intlet fullband = constant "OPUS_BANDWIDTH_FULLBAND" inttype t = [| `Narrow| `Medium| `Wide| `Superwide| `Full]let of_c = function| n when n = narrowband -> `Narrow| n when n = mediumband -> `Medium| n when n = wideband -> `Wide| n when n = superwideband -> `Superwide| n when n = fullband -> `Full| _ -> assert falselet to_c = function| `Narrow -> narrowband| `Medium -> mediumband| `Wide -> wideband| `Superwide -> superwideband| `Full -> fullbandendmodule Framesize = structlet arg = constant "OPUS_FRAMESIZE_ARG" intlet _2_5ms = constant "OPUS_FRAMESIZE_2_5_MS" intlet _5ms = constant "OPUS_FRAMESIZE_5_MS" intlet _10ms = constant "OPUS_FRAMESIZE_10_MS" intlet _20ms = constant "OPUS_FRAMESIZE_20_MS" intlet _40ms = constant "OPUS_FRAMESIZE_40_MS" intlet _60ms = constant "OPUS_FRAMESIZE_60_MS" intlet _80ms = constant "OPUS_FRAMESIZE_80_MS" intlet _100ms = constant "OPUS_FRAMESIZE_100_MS" intlet _120ms = constant "OPUS_FRAMESIZE_120_MS" inttype t = [| `Arg| `Fs_2_5ms| `Fs_5ms| `Fs_10ms| `Fs_20ms| `Fs_40ms| `Fs_60ms| `Fs_80ms| `Fs_100ms| `Fs_120ms]let to_c = function| `Arg -> arg| `Fs_2_5ms -> _2_5ms| `Fs_5ms -> _5ms| `Fs_10ms -> _10ms| `Fs_20ms -> _20ms| `Fs_40ms -> _40ms| `Fs_60ms -> _60ms| `Fs_80ms -> _80ms| `Fs_100ms -> _100ms| `Fs_120ms -> _120mslet of_c = function| n when n = arg -> `Arg| n when n = _2_5ms -> `Fs_2_5ms| n when n = _5ms -> `Fs_5ms| n when n = _10ms -> `Fs_10ms| n when n = _20ms -> `Fs_20ms| n when n = _40ms -> `Fs_40ms| n when n = _60ms -> `Fs_60ms| n when n = _80ms -> `Fs_80ms| n when n = _100ms -> `Fs_100ms| n when n = _120ms -> `Fs_120ms| _ -> assert falseendmodule Ctl = structlet set_application_request = constant "OPUS_SET_APPLICATION_REQUEST" intlet get_application_request = constant "OPUS_GET_APPLICATION_REQUEST" intlet set_bitrate_request = constant "OPUS_SET_BITRATE_REQUEST" intlet get_bitrate_request = constant "OPUS_GET_BITRATE_REQUEST" intlet set_max_bandwidth_request = constant "OPUS_SET_MAX_BANDWIDTH_REQUEST" intlet get_max_bandwidth_request = constant "OPUS_GET_MAX_BANDWIDTH_REQUEST" intlet set_vbr_request = constant "OPUS_SET_VBR_REQUEST" intlet get_vbr_request = constant "OPUS_GET_VBR_REQUEST" intlet set_bandwidth_request = constant "OPUS_SET_BANDWIDTH_REQUEST" intlet get_bandwidth_request = constant "OPUS_GET_BANDWIDTH_REQUEST" intlet set_complexity_request = constant "OPUS_SET_COMPLEXITY_REQUEST" intlet get_complexity_request = constant "OPUS_GET_COMPLEXITY_REQUEST" intlet set_inband_fec_request = constant "OPUS_SET_INBAND_FEC_REQUEST" intlet get_inband_fec_request = constant "OPUS_GET_INBAND_FEC_REQUEST" intlet set_packet_loss_perc_request = constant "OPUS_SET_PACKET_LOSS_PERC_REQUEST" intlet get_packet_loss_perc_request = constant "OPUS_GET_PACKET_LOSS_PERC_REQUEST" intlet set_dtx_request = constant "OPUS_SET_DTX_REQUEST" intlet get_dtx_request = constant "OPUS_GET_DTX_REQUEST" intlet set_vbr_constraint_request = constant "OPUS_SET_VBR_CONSTRAINT_REQUEST" intlet get_vbr_constraint_request = constant "OPUS_GET_VBR_CONSTRAINT_REQUEST" intlet set_force_channels_request = constant "OPUS_SET_FORCE_CHANNELS_REQUEST" intlet get_force_channels_request = constant "OPUS_GET_FORCE_CHANNELS_REQUEST" intlet set_signal_request = constant "OPUS_SET_SIGNAL_REQUEST" intlet get_signal_request = constant "OPUS_GET_SIGNAL_REQUEST" intlet get_lookahead_request = constant "OPUS_GET_LOOKAHEAD_REQUEST" intlet reset_state = constant "OPUS_RESET_STATE" intlet get_sample_rate_request = constant "OPUS_GET_SAMPLE_RATE_REQUEST" intlet get_final_range_request = constant "OPUS_GET_FINAL_RANGE_REQUEST" intlet get_pitch_request = constant "OPUS_GET_PITCH_REQUEST" intlet set_gain_request = constant "OPUS_SET_GAIN_REQUEST" intlet get_gain_request = constant "OPUS_GET_GAIN_REQUEST" intlet set_lsb_depth_request = constant "OPUS_SET_LSB_DEPTH_REQUEST" intlet get_lsb_depth_request = constant "OPUS_GET_LSB_DEPTH_REQUEST" intlet get_last_packet_duration_request = constant "OPUS_GET_LAST_PACKET_DURATION_REQUEST" intlet set_expert_frame_duration_request = constant "OPUS_SET_EXPERT_FRAME_DURATION_REQUEST" intlet get_expert_frame_duration_request = constant "OPUS_GET_EXPERT_FRAME_DURATION_REQUEST" intlet set_prediction_disabled_request = constant "OPUS_SET_PREDICTION_DISABLED_REQUEST" intlet get_prediction_disabled_request = constant "OPUS_GET_PREDICTION_DISABLED_REQUEST" intlet set_phase_inversion_disabled_request = constant "OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST" intlet get_phase_inversion_disabled_request = constant "OPUS_GET_PHASE_INVERSION_DISABLED_REQUEST" intlet get_in_dtx_request = constant "OPUS_GET_IN_DTX_REQUEST" intendinclude (structtype +'a handle = unit ptrlet handle: 'a handle typ = ptr voidend : sigtype +'a handleval handle: 'a handle typend)module Encoder = structtype t = [`enc] handlelet t: t typ = handleendmodule Decoder = structtype t = [`dec] handlelet t: t typ = handleendend
(rule(targets c_flags.sexp c_library_flags.sexp c_flags.lines)(deps(:discover config/discover.exe))(action(run %{discover})))(rule(targets opus.ml opus_stubs.c)(deps(:gen opus.c.ml)c_flags.lines)(action(chdir%{workspace_root}(run%{bin:ppx_cstubs}%{gen}-pkgctypes-o%{targets}--%{read-lines:c_flags.lines}))))
(private_modules(:standard \ opus))(libraries unix ctypes ctypes.foreign ppx_cstubs)(preprocess(pps ppx_cstubs.merlin))(foreign_stubs(language c)(names opus_stubs)(flags(:standard(:include c_flags.sexp))))(c_library_flags(:standard(:include c_library_flags.sexp))))
(modules opus)(libraries opus.c unix ctypes ctypes.foreign)); (library; (name opus); (public_name opus); (wrapped false); (private_modules; (:standard \ opus)); (libraries unix ctypes ctypes.foreign ppx_cstubs); (preprocess; (pps ppx_cstubs.merlin)); (foreign_stubs; (language c); (names opus_stubs); (flags; (:standard; (:include c_flags.sexp)))); (c_library_flags; (:standard; (:include c_library_flags.sexp))))
external opus_encoder_ctl: enc_handle -> int32_t -> int32_t ptr -> Error.t = "opus_encoder_ctl"external opus_decoder_ctl: dec_handle -> int32_t -> int32_t ptr -> Error.t = "opus_decoder_ctl"
(* we don't use these directly, but it'sgood for checking at cstubs compile time *)external opus_encoder_ctl: enc_handle -> int32_t -> int32_t ptr -> Error.t = "opus_encoder_ctl" [@@ocaml.warning "-32"]external opus_decoder_ctl: dec_handle -> int32_t -> int32_t ptr -> Error.t = "opus_decoder_ctl" [@@ocaml.warning "-32"]
external opus_encoder_size: int -> int = "opus_encoder_get_size"external opus_encoder_init: t -> int32_t -> int -> int -> Error.t = "opus_encoder_init"external opus_encoder_create: int32_t -> int -> int -> Error.t ptr -> t = "opus_encoder_create"
external opus_encoder_get_size: int -> int = "opus_encoder_get_size"external opus_encoder_init: t -> fs:int32_t -> channels:int -> app:int -> Error.t = "opus_encoder_init"external opus_encoder_create: fs:int32_t -> channels:int -> app:int -> Error.t ptr -> t = "opus_encoder_create"
module Decoder = structtype decoder = [`dec] handlelet%c t = ptr voidexternal opus_decoder_get_size: int -> int = "opus_decoder_get_size"external opus_decoder_init: t -> fs:int32_t -> channels:int -> Error.t = "opus_decoder_init"external opus_decoder_create: fs:int32_t -> channels:int -> Error.t ptr -> t = "opus_decoder_create"external opus_decoder_destroy: t -> void = "opus_decoder_destroy"external opus_decode: t -> buf:uchar ptr -> len:int32_t -> pcm:int16_t ptr -> fs:int -> fec:bool-> int = "opus_decode"external opus_decode_float: t -> buf:uchar ptr -> len:int32_t -> pcm:float ptr -> fs:int -> fec:bool -> int = "opus_decode_float"type t = {dec: dec;samplerate: int;channels: int;}and dec = | Own of decoder | C of decoder * gcand gc = unit ptrlet _dec = function | Own e | C (e, _) -> elet create ?(samplerate=48000) ?(channels=`stereo) () =let channels = match channels with | `stereo -> 2 | `mono -> 1 inlet err, dec = match own with| false ->let err = allocate int (-1) inlet dec = opus_decoder_create ~fs:Int32.(of_int samplerate) ~channels err inlet gc =allocate_n ~finalise:(fun _ -> opus_decoder_destroy dec)~count:0 voidin!@err, C (dec, gc)| true ->let dec =allocate_n ~count:(opus_decoder_get_size channels) uchar|> coerce (ptr uchar) (ptr void)inlet err = opus_decoder_init dec ~fs:Int32.(of_int samplerate) ~channels inerr, Own decinError.wrap dec err|> Result.map (fun dec -> {dec;samplerate;channels;})let size { channels; _ } = opus_decoder_get_size channelslet _decode_blit:type a b.t ->?fec:bool ->?buf_off:int ->?buf_len:int ->bigstring ->?pcm_off:int ->?framesize:int ->(a, b, BA.c_layout) BA1.t ->(a, b, BA.c_layout) BA1.t result =fun t ?(fec=false) ?(buf_off=0) ?buf_len buf ?(pcm_off=0) ?(framesize=120) pcm ->let pcm = BA1.sub pcm pcm_off (BA1.dim pcm - pcm_off) inlet buf = BA1.sub buf buf_off (match buf_len with | None -> (BA1.dim buf - buf_off) | Some l -> l) inlet fs = t.samplerate / 1000 * framesize inif BA1.dim pcm < (fs * t.channels) thenraise (Invalid_argument "given pcm frame does not have enough samples");let buf_p =(bigarray_start array1 buf) |>coerce (ptr char) (ptr uchar)inlet len = Int32.of_int @@ BA1.dim buf inlet len = match BA1.kind pcm with| BA.Int16_signed -> opus_decode (_dec t.dec) ~buf:buf_p ~len ~pcm:(bigarray_start array1 pcm) ~fs ~fec| BA.Float32 -> opus_decode_float (_dec t.dec) ~buf:buf_p ~len ~pcm:(bigarray_start array1 pcm) ~fs ~fec| _ ->print_endline "!!!FATAL!!! invalid opus pcm buffer type (must be s16 or f32)";exit (-1)inmatch len with| n when n < 0 -> Error (Error.of_int n)| n -> Ok (BA1.sub pcm 0 (n * t.channels))let decode_blit t ?fec ?buf_off ?buf_len buf ?pcm_off ?framesize pcm =_decode_blit t ?fec ?buf_off ?buf_len buf ?pcm_off ?framesize pcmlet decode t ?fec ?off ?len buf =let framesize = 120 inlet pcm = BA1.create BA.int16_signed BA.c_layout (t.samplerate / 1000 * framesize * t.channels) in_decode_blit t ?fec ?buf_off:off ?buf_len:len buf ~framesize pcmlet decode_blit_float t ?fec ?buf_off ?buf_len buf ?pcm_off ?framesize pcm =_decode_blit t ?fec ?buf_off ?buf_len buf ?pcm_off ?framesize pcmlet decode_float t ?fec ?off ?len buf =let framesize = 120 inlet pcm = BA1.create BA.float32 BA.c_layout (t.samplerate / 1000 * framesize * t.channels) in_decode_blit t ?fec ?buf_off:off ?buf_len:len buf ~framesize pcmlet ctl t req = CTL.request ~ctl_fn:"opus_decoder_ctl" (_dec t.dec) reqend
module C = Opus_cmodule T = Opus_c.Typesopen Ctypeslet mem = `Ocamlmodule Error = structtype t = T.Error.tlet wrap_lazy fn e = match T.Error.of_c_opt e with| Some err -> Error err| None -> Ok (fn ())let wrap a = wrap_lazy (fun () -> a)let to_string = C.Error.to_stringlet to_string = function| `Alloc_fail -> to_string T.Error.alloc_fail| `Invalid_state -> to_string T.Error.invalid_state| `Unimplemented -> to_string T.Error.unimplemented| `Invalid_packet -> to_string T.Error.invalid_packet| `Internal_error -> to_string T.Error.internal_error| `Buffer_too_small -> to_string T.Error.buffer_too_small| `Bad_arg -> to_string T.Error.bad_arg| `Unknown other -> "unknown error: " ^ (string_of_int other)let show = to_stringlet pp fmt t = Format.fprintf fmt "%s" (show t)endtype nonrec 'a result = ('a, Error.t) resulttype framesize = T.Framesize.ttype bitrate = T.Bitrate.ttype bandwidth = T.Bandwidth.ttype application = T.Application.ttype signal = T.Signal.tmodule CTL = structtype enc = [`enc]type dec = [`dec]type 'a both = [< `enc | `dec] as 'atype 'a handle = 'a T.handletype ('handle, 'res) t =(* generic *)| Reset_state: (_ both, unit) t| Get_final_range: (_ both, int) t| Get_bandwidth: (_ both, [`Auto | bandwidth]) t| Get_sample_rate: (_ both, int) t| Set_phase_inversion_disabled: bool -> (_ both, unit) t| Get_phase_inversion_disabled: (_ both, bool) t| Get_in_DTX: (_ both, bool) t(* encoder *)| Set_complexity: int -> (enc, unit) t| Get_complexity: (enc, int) t| Set_bitrate: [`Auto | bitrate] -> (enc, unit) t| Get_bitrate: (enc, [`Auto | bitrate]) t| Set_VBR: bool -> (enc, unit) t| Get_VBR: (enc, bool) t| Set_VBR_constraint: bool -> (enc, unit) t| Get_VBR_constraint: (enc, bool) t| Set_force_channels: [`Auto | `Mono | `Stereo] -> (enc, unit) t| Get_force_channels: (enc, [`Auto | `Mono | `Stereo]) t| Set_max_bandwidth: bandwidth -> (enc, unit) t| Get_max_bandwidth: (enc, bandwidth) t| Set_bandwidth: [`Auto | bandwidth] -> (enc, unit) t| Set_signal: [`Auto | signal] -> (enc, unit) t| Get_signal: (enc, [`Auto | signal]) t| Set_application: application -> (enc, unit) t| Get_application: (enc, application) t| Get_lookahead: (enc, int) t| Set_inband_FEC: bool -> (enc, unit) t| Get_inband_FEC: (enc, bool) t| Set_packet_loss_perc: int -> (enc, unit) t| Get_packet_loss_perc: (enc, int) t| Set_DTX: bool -> (enc, unit) t| Get_DTX: (enc, bool) t| Set_LSB_depth: int -> (enc, unit) t| Get_LSB_depth: (enc, int) t| Set_expert_frame_duration: framesize -> (enc, unit) t| Get_expert_frame_duration: (enc, framesize) t| Set_prediction_disabled: bool -> (enc, unit) t| Get_prediction_disabled: (enc, bool) t(* decoder *)| Set_gain: int -> (dec, unit) t| Get_gain: (dec, int) t| Get_last_packet_duration: (dec, int) t| Get_pitch: (dec, int) tlet _code: type a b. (a, b) t -> int32 =fun t ->let o = match t with(* generic *)| Reset_state -> T.Ctl.reset_state| Get_final_range -> T.Ctl.get_final_range_request| Get_bandwidth -> T.Ctl.get_bandwidth_request| Get_sample_rate -> T.Ctl.get_sample_rate_request| Set_phase_inversion_disabled _ -> T.Ctl.set_phase_inversion_disabled_request| Get_phase_inversion_disabled -> T.Ctl.get_phase_inversion_disabled_request| Get_in_DTX -> T.Ctl.get_in_dtx_request(* encoder *)| Set_complexity _ -> T.Ctl.set_complexity_request| Get_complexity -> T.Ctl.get_complexity_request| Set_bitrate _ -> T.Ctl.set_bitrate_request| Get_bitrate -> T.Ctl.get_bitrate_request| Set_VBR _ -> T.Ctl.set_vbr_request| Get_VBR -> T.Ctl.get_vbr_request| Set_VBR_constraint _ -> T.Ctl.set_vbr_constraint_request| Get_VBR_constraint -> T.Ctl.get_vbr_constraint_request| Set_force_channels _ -> T.Ctl.set_force_channels_request| Get_force_channels -> T.Ctl.get_force_channels_request| Set_max_bandwidth _ -> T.Ctl.set_max_bandwidth_request| Get_max_bandwidth -> T.Ctl.get_max_bandwidth_request| Set_bandwidth _ -> T.Ctl.set_bandwidth_request| Set_signal _ -> T.Ctl.set_signal_request| Get_signal -> T.Ctl.get_signal_request| Set_application _ -> T.Ctl.set_application_request| Get_application -> T.Ctl.get_application_request| Get_lookahead -> T.Ctl.get_lookahead_request| Set_inband_FEC _ -> T.Ctl.set_inband_fec_request| Get_inband_FEC -> T.Ctl.get_inband_fec_request| Set_packet_loss_perc _ -> T.Ctl.set_packet_loss_perc_request| Get_packet_loss_perc -> T.Ctl.get_packet_loss_perc_request| Set_DTX _ -> T.Ctl.set_dtx_request| Get_DTX -> T.Ctl.get_dtx_request| Set_LSB_depth _ -> T.Ctl.set_lsb_depth_request| Get_LSB_depth -> T.Ctl.get_lsb_depth_request| Set_expert_frame_duration _ -> T.Ctl.set_expert_frame_duration_request| Get_expert_frame_duration -> T.Ctl.get_expert_frame_duration_request| Set_prediction_disabled _ -> T.Ctl.set_prediction_disabled_request| Get_prediction_disabled -> T.Ctl.get_prediction_disabled_request(* decoder *)| Set_gain _ -> T.Ctl.set_gain_request| Get_gain -> T.Ctl.get_gain_request| Get_last_packet_duration -> T.Ctl.get_last_packet_duration_request| Get_pitch -> T.Ctl.get_pitch_requestinInt32.of_int omodule R = structtype _ arg =| Arg: 'a * 'a conv -> 'a argand _ conv =| Conv: ('a -> int32) * (int32 -> 'a) -> 'a convtype ('i, 'o) def =| Set: 'i arg -> ('i, unit) def| Get: 'o conv -> (unit, 'o) deflet fn_0 ~code ~handle name =let fn = Foreign.foreign name (T.handle @-> int32_t @-> returning int) infn handle code |> Error.wrap ()let fn_1: type i o. code:int32 -> handle:'a handle -> string -> (i, o) def -> o result =fun ~code ~handle name def ->match def with| Set (Arg (a, Conv (ser, _))) ->let fn = Foreign.foreign name (T.handle @-> int32_t @-> int32_t @-> returning int) infn handle code (ser a) |> Error.wrap ()| Get (Conv (_, des)) ->let fn = Foreign.foreign name (T.handle @-> int32_t @-> ptr int32_t @-> returning int) inlet v = allocate int32_t 0l infn handle code v |> Error.wrap (des !@v)let (%>) a b x = b @@ a xlet set arg = Set arglet get conv = Get convlet conv: type i. (i -> int) -> (int -> i) -> i conv =fun ser des -> Conv (ser %> Int32.of_int, Int32.to_int %> des)let arg conv a = Arg (a, conv)let bool = conv Bool.to_int (function | 0 -> false | 1 -> true | _ -> assert false)let int = conv (fun i -> i) (fun i -> i)let max_bandwidth =conv T.Bandwidth.to_c T.Bandwidth.of_clet bandwidth =let to_int = function | #bandwidth as b -> T.Bandwidth.to_c b | `Auto -> T.auto inlet of_int = function | n when n = T.auto -> `Auto | n -> T.Bandwidth.of_c n inconv to_int of_intlet bitrate =let to_int = function| `Auto -> T.auto| #bitrate as br -> T.Bitrate.to_c brinlet of_int = function| n when n = T.auto -> `Auto| br -> T.Bitrate.of_c brinconv to_int of_intlet signal =let to_int = function| `Auto -> T.auto| #signal as s -> T.Signal.to_c sinlet of_int = function| s when s = T.auto -> `Auto| s -> T.Signal.of_c sinconv to_int of_intlet channels =let to_int = function| `Auto -> T.auto| `Mono -> 1| `Stereo -> 2inlet of_int = function| n when n = T.auto -> `Auto| 1 -> `Mono| 2 -> `Stereo| _ -> assert falseinconv to_int of_intlet application = conv T.Application.to_c T.Application.of_clet framesize = conv T.Framesize.to_c T.Framesize.of_cendlet request: type a b. ctl_fn:string -> a handle -> (a, b) t -> b result= fun ~ctl_fn handle req ->let code = _code req inmatch req with(* generic *)| Reset_state -> R.fn_0 ~code ~handle ctl_fn| Get_final_range -> R.fn_1 ~code ~handle ctl_fn R.(get int)| Get_bandwidth -> R.fn_1 ~code ~handle ctl_fn R.(get bandwidth)| Get_sample_rate -> R.fn_1 ~code ~handle ctl_fn R.(get int)| Set_phase_inversion_disabled b -> R.fn_1 ~code ~handle ctl_fn R.(set @@ arg bool b)| Get_phase_inversion_disabled -> R.fn_1 ~code ~handle ctl_fn R.(get bool)| Get_in_DTX -> R.fn_1 ~code ~handle ctl_fn R.(get bool)(* encoder *)| Set_complexity c -> R.fn_1 ~code ~handle ctl_fn R.(set @@ arg int c)| Get_complexity -> R.fn_1 ~code ~handle ctl_fn R.(get int)| Set_bitrate br -> R.fn_1 ~code ~handle ctl_fn R.(set @@ arg bitrate br)| Get_bitrate -> R.fn_1 ~code ~handle ctl_fn R.(get bitrate)| Set_VBR b -> R.fn_1 ~code ~handle ctl_fn R.(set @@ arg bool b)| Get_VBR -> R.fn_1 ~code ~handle ctl_fn R.(get bool)| Set_VBR_constraint b -> R.fn_1 ~code ~handle ctl_fn R.(set @@ arg bool b)| Get_VBR_constraint -> R.fn_1 ~code ~handle ctl_fn R.(get bool)| Set_force_channels ch -> R.fn_1 ~code ~handle ctl_fn R.(set @@ arg channels ch)| Get_force_channels -> R.fn_1 ~code ~handle ctl_fn R.(get channels)| Set_max_bandwidth bw -> R.fn_1 ~code ~handle ctl_fn R.(set @@ arg max_bandwidth bw)| Get_max_bandwidth -> R.fn_1 ~code ~handle ctl_fn R.(get max_bandwidth)| Set_bandwidth bw -> R.fn_1 ~code ~handle ctl_fn R.(set @@ arg bandwidth bw)| Set_signal s -> R.fn_1 ~code ~handle ctl_fn R.(set @@ arg signal s)| Get_signal -> R.fn_1 ~code ~handle ctl_fn R.(get signal)| Set_application a -> R.fn_1 ~code ~handle ctl_fn R.(set @@ arg application a)| Get_application -> R.fn_1 ~code ~handle ctl_fn R.(get application)| Get_lookahead -> R.fn_1 ~code ~handle ctl_fn R.(get int)| Set_inband_FEC b -> R.fn_1 ~code ~handle ctl_fn R.(set @@ arg bool b)| Get_inband_FEC -> R.fn_1 ~code ~handle ctl_fn R.(get bool)| Set_packet_loss_perc plp -> R.fn_1 ~code ~handle ctl_fn R.(set @@ arg int plp)| Get_packet_loss_perc -> R.fn_1 ~code ~handle ctl_fn R.(get int)| Set_DTX b -> R.fn_1 ~code ~handle ctl_fn R.(set @@ arg bool b)| Get_DTX -> R.fn_1 ~code ~handle ctl_fn R.(get bool)| Set_LSB_depth d -> R.fn_1 ~code ~handle ctl_fn R.(set @@ arg int d)| Get_LSB_depth -> R.fn_1 ~code ~handle ctl_fn R.(get int)| Set_expert_frame_duration fs -> R.fn_1 ~code ~handle ctl_fn R.(set @@ arg framesize fs)| Get_expert_frame_duration -> R.fn_1 ~code ~handle ctl_fn R.(get framesize)| Set_prediction_disabled b -> R.fn_1 ~code ~handle ctl_fn R.(set @@ arg bool b)| Get_prediction_disabled -> R.fn_1 ~code ~handle ctl_fn R.(get bool)(* encoder *)| Set_gain g -> R.fn_1 ~code ~handle ctl_fn R.(set @@ arg int g)| Get_gain -> R.fn_1 ~code ~handle ctl_fn R.(get int)| Get_last_packet_duration -> R.fn_1 ~code ~handle ctl_fn R.(get int)| Get_pitch -> R.fn_1 ~code ~handle ctl_fn R.(get int)endmodule BA = Bigarraymodule BA1 = Bigarray.Array1type bigstring = (char, BA.int8_unsigned_elt, BA.c_layout) BA1.ttype s16frame = (int, BA.int16_signed_elt, BA.c_layout) BA1.ttype f32frame = (float, BA.float32_elt, BA.c_layout) BA1.tmodule Encoder = structtype encoder = T.Encoder.ttype t = {enc: enc;samplerate: int;channels: int;app: application;}and enc = | Own of encoder | C of encoder * gcand gc = unit ptrtype packet = [ `Packet of bigstring | `DTX ]let recommended_max_size = 4000let _enc = function | Own e | C (e, _) -> elet create ?(samplerate=48000) ?(channels=`stereo) ?(application=`Audio) () =let channels = match channels with | `stereo -> 2 | `mono -> 1 inlet app = T.Application.to_c application inlet err, enc = match mem with| `C ->let err = allocate int (-1) inlet enc = C.Encoder.create Int32.(of_int samplerate) channels app err inlet gc =allocate_n ~finalise:(fun _ -> C.Encoder.destroy enc)~count:0 voidin!@err, C (enc, gc)| `Ocaml ->let enc =allocate_n ~count:(C.Encoder.get_size channels) uchar|> coerce (ptr uchar) (ptr void)inlet err = C.Encoder.init enc Int32.(of_int samplerate) channels app inerr, Own (Obj.magic enc)inError.wrap enc err|> Result.map (fun enc -> {enc;samplerate;channels;app=application;})let size { channels; _ } = C.Encoder.get_size channelslet _encode_blit:type a b.t ->?pcm_off:int ->?duration:int ->(a, b, BA.c_layout) BA1.t ->?buf_off:int ->?max_size:int ->bigstring ->packet result =fun t ?(pcm_off=0) ?(duration=20) pcm?(buf_off=0) ?max_size buf ->let pcm = BA1.sub pcm pcm_off (BA1.dim pcm - pcm_off) inlet buf = BA1.sub buf buf_off (BA1.dim buf - buf_off) inlet max_size = match max_size with| Some size when size > (BA1.dim buf) ->raise (Invalid_argument "max_size is bigger than available buf space")| Some s -> s| None -> BA1.dim bufinlet fs = t.samplerate / 1000 * duration inif BA1.dim pcm < (fs * t.channels) thenraise (Invalid_argument "given pcm frame does not have enough samples");let buf_p =(bigarray_start array1 buf) |>coerce (ptr char) (ptr uchar)inlet len = match BA1.kind pcm with| BA.Int16_signed -> C.Encoder.encode (_enc t.enc) (bigarray_start array1 pcm) fs buf_p max_size| BA.Float32 -> C.Encoder.encode_float (_enc t.enc) (bigarray_start array1 pcm) fs buf_p max_size| _ ->print_endline "!!!FATAL!!! invalid opus pcm buffer type (must be s16 or f32)";exit (-1)inmatch len with| n when n < 0 -> Error (T.Error.of_c n)| n when n <= 2 -> Ok `DTX| n -> Ok (`Packet (BA1.sub buf 0 n))let encode_blit t ?pcm_off ?duration pcm ?buf_off ?max_size buf =_encode_blit t ?pcm_off ?duration pcm ?buf_off ?max_size buflet encode t ?off ?duration ?(max_size=recommended_max_size) pcm =let buf = BA1.create BA.char BA.c_layout max_size in_encode_blit t ?pcm_off:off ?duration pcm buflet encode_blit_float t ?pcm_off ?duration pcm ?buf_off ?max_size buf =_encode_blit t ?pcm_off ?duration pcm ?buf_off ?max_size buflet encode_float t ?off ?duration ?(max_size=recommended_max_size) pcm =let buf = BA1.create BA.char BA.c_layout max_size in_encode_blit t ?pcm_off:off ?duration pcm buflet ctl t req = CTL.request ~ctl_fn:"opus_encoder_ctl" (_enc t.enc) reqendmodule Decoder = structtype decoder = T.Decoder.ttype t = {dec: dec;samplerate: int;channels: int;}and dec = | Own of decoder | C of decoder * gcand gc = unit ptrlet _dec = function | Own e | C (e, _) -> elet create ?(samplerate=48000) ?(channels=`stereo) () =let channels = match channels with | `stereo -> 2 | `mono -> 1 inlet err, dec = match mem with| `C ->let err = allocate int (-1) inlet dec = C.Decoder.create Int32.(of_int samplerate) channels err inlet gc =allocate_n ~finalise:(fun _ -> C.Decoder.destroy dec)~count:0 voidin!@err, C (dec, gc)| `Ocaml ->let dec =allocate_n ~count:(C.Decoder.get_size channels) uchar|> coerce (ptr uchar) (ptr void)inlet err = C.Decoder.init dec Int32.(of_int samplerate) channels inerr, Own (Obj.magic dec)inError.wrap dec err|> Result.map (fun dec -> {dec;samplerate;channels;})let size { channels; _ } = C.Decoder.get_size channelslet _decode_blit:type a b.t ->?fec:bool ->?buf_off:int ->?buf_len:int ->bigstring ->?pcm_off:int ->?framesize:int ->(a, b, BA.c_layout) BA1.t ->(a, b, BA.c_layout) BA1.t result =fun t ?(fec=false) ?(buf_off=0) ?buf_len buf ?(pcm_off=0) ?(framesize=120) pcm ->let pcm = BA1.sub pcm pcm_off (BA1.dim pcm - pcm_off) inlet buf = BA1.sub buf buf_off (match buf_len with | None -> (BA1.dim buf - buf_off) | Some l -> l) inlet fs = t.samplerate / 1000 * framesize inif BA1.dim pcm < (fs * t.channels) thenraise (Invalid_argument "given pcm frame does not have enough samples");let buf_p =(bigarray_start array1 buf) |>coerce (ptr char) (ptr uchar)inlet len = Int32.of_int @@ BA1.dim buf inlet len = match BA1.kind pcm with| BA.Int16_signed -> C.Decoder.decode (_dec t.dec) buf_p len (bigarray_start array1 pcm) fs fec| BA.Float32 -> C.Decoder.decode_float (_dec t.dec) buf_p len (bigarray_start array1 pcm) fs fec| _ ->print_endline "!!!FATAL!!! invalid opus pcm buffer type (must be s16 or f32)";exit (-1)inmatch len with| n when n < 0 -> Error (T.Error.of_c n)| n -> Ok (BA1.sub pcm 0 (n * t.channels))let decode_blit t ?fec ?buf_off ?buf_len buf ?pcm_off ?framesize pcm =_decode_blit t ?fec ?buf_off ?buf_len buf ?pcm_off ?framesize pcmlet decode t ?fec ?off ?len buf =let framesize = 120 inlet pcm = BA1.create BA.int16_signed BA.c_layout (t.samplerate / 1000 * framesize * t.channels) in_decode_blit t ?fec ?buf_off:off ?buf_len:len buf ~framesize pcmlet decode_blit_float t ?fec ?buf_off ?buf_len buf ?pcm_off ?framesize pcm =_decode_blit t ?fec ?buf_off ?buf_len buf ?pcm_off ?framesize pcmlet decode_float t ?fec ?off ?len buf =let framesize = 120 inlet pcm = BA1.create BA.float32 BA.c_layout (t.samplerate / 1000 * framesize * t.channels) in_decode_blit t ?fec ?buf_off:off ?buf_len:len buf ~framesize pcmlet ctl t req = CTL.request ~ctl_fn:"opus_decoder_ctl" (_dec t.dec) reqend
type framesize = [| `arg| `fs_2_5ms| `fs_5ms| `fs_10ms| `fs_20ms| `fs_40ms| `fs_60ms| `fs_80ms| `fs_100ms| `fs_120ms]
type bandwidth = Opus_c.Types.Bandwidth.t
| Reset_state: (_ both handle, unit) t| Get_final_range: (_ both handle, int) t| Get_bandwidth: (_ both handle, [`auto | bandwidth]) t| Get_sample_rate: (_ both handle, int) t| Set_phase_inversion_disabled: bool -> (_ both handle, unit) t| Get_phase_inversion_disabled: (_ both handle, bool) t| Get_in_DTX: (_ both handle, bool) t
| Reset_state: (_ both, unit) t| Get_final_range: (_ both, int) t| Get_bandwidth: (_ both, [`Auto | bandwidth]) t| Get_sample_rate: (_ both, int) t| Set_phase_inversion_disabled: bool -> (_ both, unit) t| Get_phase_inversion_disabled: (_ both, bool) t| Get_in_DTX: (_ both, bool) t
| Set_complexity: int -> (enc handle, unit) t| Get_complexity: (enc handle, int) t| Set_bitrate: [`auto | `max | `bps of int] -> (enc handle, unit) t| Get_bitrate: (enc handle, [`auto | `max | `bps of int]) t| Set_VBR: bool -> (enc handle, unit) t| Get_VBR: (enc handle, bool) t| Set_VBR_constraint: bool -> (enc handle, unit) t| Get_VBR_constraint: (enc handle, bool) t| Set_force_channels: [`auto | `mono | `stereo] -> (enc handle, unit) t| Get_force_channels: (enc handle, [`auto | `mono | `stereo]) t| Set_max_bandwidth: bandwidth -> (enc handle, unit) t| Get_max_bandwidth: (enc handle, bandwidth) t| Set_bandwidth: [`auto | bandwidth] -> (enc handle, unit) t| Set_signal: [`auto | `voice | `music] -> (enc handle, unit) t| Get_signal: (enc handle, [`auto | `voice | `music]) t| Set_application: application -> (enc handle, unit) t| Get_application: (enc handle, application) t| Get_lookahead: (enc handle, int) t| Set_inband_FEC: bool -> (enc handle, unit) t| Get_inband_FEC: (enc handle, bool) t| Set_packet_loss_perc: int -> (enc handle, unit) t| Get_packet_loss_perc: (enc handle, int) t| Set_DTX: bool -> (enc handle, unit) t| Get_DTX: (enc handle, bool) t| Set_LSB_depth: int -> (enc handle, unit) t| Get_LSB_depth: (enc handle, int) t| Set_expert_frame_duration: framesize -> (enc handle, unit) t| Get_expert_frame_duration: (enc handle, framesize) t| Set_prediction_disabled: bool -> (enc handle, unit) t| Get_prediction_disabled: (enc handle, bool) t
| Set_complexity: int -> (enc, unit) t| Get_complexity: (enc, int) t| Set_bitrate: [`Auto | bitrate] -> (enc, unit) t| Get_bitrate: (enc, [`Auto | bitrate]) t| Set_VBR: bool -> (enc, unit) t| Get_VBR: (enc, bool) t| Set_VBR_constraint: bool -> (enc, unit) t| Get_VBR_constraint: (enc, bool) t| Set_force_channels: [`Auto | `Mono | `Stereo] -> (enc, unit) t| Get_force_channels: (enc, [`Auto | `Mono | `Stereo]) t| Set_max_bandwidth: bandwidth -> (enc, unit) t| Get_max_bandwidth: (enc, bandwidth) t| Set_bandwidth: [`Auto | bandwidth] -> (enc, unit) t| Set_signal: [`Auto | signal] -> (enc, unit) t| Get_signal: (enc, [`Auto | signal]) t| Set_application: application -> (enc, unit) t| Get_application: (enc, application) t| Get_lookahead: (enc, int) t| Set_inband_FEC: bool -> (enc, unit) t| Get_inband_FEC: (enc, bool) t| Set_packet_loss_perc: int -> (enc, unit) t| Get_packet_loss_perc: (enc, int) t| Set_DTX: bool -> (enc, unit) t| Get_DTX: (enc, bool) t| Set_LSB_depth: int -> (enc, unit) t| Get_LSB_depth: (enc, int) t| Set_expert_frame_duration: framesize -> (enc, unit) t| Get_expert_frame_duration: (enc, framesize) t| Set_prediction_disabled: bool -> (enc, unit) t| Get_prediction_disabled: (enc, bool) t(* decoder *)| Set_gain: int -> (dec, unit) t| Get_gain: (dec, int) t| Get_last_packet_duration: (dec, int) t| Get_pitch: (dec, int) t
val ctl: t -> ([`enc] handle, 'a) CTL.t -> 'a result
val ctl: t -> ([`enc], 'a) CTL.t -> 'a resultendmodule Decoder: sigtype tval create:?samplerate:int ->?channels:[`mono | `stereo] ->unit ->t resultval size: t -> intval decode_blit:t ->?fec:bool ->?buf_off:int ->?buf_len:int ->bigstring ->?pcm_off:int ->?framesize:int ->s16frame ->s16frame resultval decode:t ->?fec:bool ->?off:int ->?len:int ->bigstring ->s16frame resultval decode_blit_float:t ->?fec:bool ->?buf_off:int ->?buf_len:int ->bigstring ->?pcm_off:int ->?framesize:int ->f32frame ->f32frame resultval decode_float:t ->?fec:bool ->?off:int ->?len:int ->bigstring ->f32frame resultval ctl: t -> ([`dec], 'a) CTL.t -> 'a result