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, and
Async.
This package has an unstable interface; it is intended only to share configuration between
different packages from Jane Street. Future updates may not be backward-compatible, and we
do 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 from
strings or other medium.
The library is focused on performances but still provide full generic
parsers 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 so
that one can recover original positions in order to report properly
located errors at little cost
- the Concrete Syntax Tree parsers, produce values of type
[Parsexp.Cst.t] which record the concrete layout of the s-expression
syntax, including comments
This library is portable and doesn't provide IO functions. To read
s-expressions from files or other external sources, you should use
parsexp_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 a
verification 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 provides
a 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 library
The Core suite of libraries is an industrial strength alternative to
OCaml's standard library that was developed by Jane Street, the
largest 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 nanoseconds
since 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-to
types_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_types
module Def (F : Ctypes.FOREIGN) = struct
open Ctypes
open F
module Types = Opus_c_types
module Error = struct
let to_string = foreign "opus_strerror" (T.Error.t @-> returning string)
end
module Encoder = struct
let 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)
end
module Decoder = struct
let 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)
end
end
let c_headers = {|
#include <opus.h>
#include <opus_multistream.h>
|}
let write_stub fname =
let oc = open_out_bin fname in
let ext = Filename.extension fname in
let format = Format.formatter_of_out_channel oc in
let 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)"
in
fn ~concurrency:Cstubs.unlocked format ~prefix:"opus_stubs" (module Ffi_stubs.Def);
Format.pp_print_flush format ();
close_out oc
let () =
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) in
let oc = open_out_bin fname in
let format =
Format.formatter_of_out_channel oc
in
Format.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) = struct
open Ctypes
open F
module Error = struct
let t = int
let alloc_fail = constant "OPUS_ALLOC_FAIL" int
let invalid_state = constant "OPUS_INVALID_STATE" int
let unimplemented = constant "OPUS_UNIMPLEMENTED" int
let invalid_packet = constant "OPUS_INVALID_PACKET" int
let internal_error = constant "OPUS_INTERNAL_ERROR" int
let buffer_too_small = constant "OPUS_BUFFER_TOO_SMALL" int
let bad_arg = constant "OPUS_BAD_ARG" int
let ok = constant "OPUS_OK" int
type 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 other
let of_c_opt e =
match of_c e with
| err -> Some err
| exception Invalid_argument _ -> None
end
let auto = constant "OPUS_AUTO" int
module Application = struct
let voip = constant "OPUS_APPLICATION_VOIP" int
let audio = constant "OPUS_APPLICATION_AUDIO" int
let restricted_lowedelay = constant "OPUS_APPLICATION_RESTRICTED_LOWDELAY" int
type t = [
| `Voip
| `Audio
| `Restricted_lowdelay
]
let to_c = function
| `Voip -> voip
| `Audio -> audio
| `Restricted_lowdelay -> restricted_lowedelay
let of_c = function
| n when n = voip -> `Voip
| n when n = audio -> `Audio
| n when n = restricted_lowedelay -> `Restricted_lowdelay
| _ -> assert false
end
module Signal = struct
let voice = constant "OPUS_SIGNAL_VOICE" int
let music = constant "OPUS_SIGNAL_MUSIC" int
type t = [
| `Voice
| `Music
]
let of_c = function
| n when n = voice -> `Voice
| n when n = music -> `Music
| _ -> assert false
let to_c = function
| `Voice -> voice
| `Music -> music
end
module Bitrate = struct
let max = constant "OPUS_BITRATE_MAX" int
type t = [
| `Max
| `Bps of int
]
let of_c = function
| n when n = max -> `Max
| n -> `Bps n
let to_c = function
| `Max -> max
| `Bps bps -> bps
end
module Bandwidth = struct
let narrowband = constant "OPUS_BANDWIDTH_NARROWBAND" int
let mediumband = constant "OPUS_BANDWIDTH_MEDIUMBAND" int
let wideband = constant "OPUS_BANDWIDTH_WIDEBAND" int
let superwideband = constant "OPUS_BANDWIDTH_SUPERWIDEBAND" int
let fullband = constant "OPUS_BANDWIDTH_FULLBAND" int
type 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 false
let to_c = function
| `Narrow -> narrowband
| `Medium -> mediumband
| `Wide -> wideband
| `Superwide -> superwideband
| `Full -> fullband
end
module Framesize = struct
let arg = constant "OPUS_FRAMESIZE_ARG" int
let _2_5ms = constant "OPUS_FRAMESIZE_2_5_MS" int
let _5ms = constant "OPUS_FRAMESIZE_5_MS" int
let _10ms = constant "OPUS_FRAMESIZE_10_MS" int
let _20ms = constant "OPUS_FRAMESIZE_20_MS" int
let _40ms = constant "OPUS_FRAMESIZE_40_MS" int
let _60ms = constant "OPUS_FRAMESIZE_60_MS" int
let _80ms = constant "OPUS_FRAMESIZE_80_MS" int
let _100ms = constant "OPUS_FRAMESIZE_100_MS" int
let _120ms = constant "OPUS_FRAMESIZE_120_MS" int
type 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 -> _120ms
let 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 false
end
module Ctl = struct
let set_application_request = constant "OPUS_SET_APPLICATION_REQUEST" int
let get_application_request = constant "OPUS_GET_APPLICATION_REQUEST" int
let set_bitrate_request = constant "OPUS_SET_BITRATE_REQUEST" int
let get_bitrate_request = constant "OPUS_GET_BITRATE_REQUEST" int
let set_max_bandwidth_request = constant "OPUS_SET_MAX_BANDWIDTH_REQUEST" int
let get_max_bandwidth_request = constant "OPUS_GET_MAX_BANDWIDTH_REQUEST" int
let set_vbr_request = constant "OPUS_SET_VBR_REQUEST" int
let get_vbr_request = constant "OPUS_GET_VBR_REQUEST" int
let set_bandwidth_request = constant "OPUS_SET_BANDWIDTH_REQUEST" int
let get_bandwidth_request = constant "OPUS_GET_BANDWIDTH_REQUEST" int
let set_complexity_request = constant "OPUS_SET_COMPLEXITY_REQUEST" int
let get_complexity_request = constant "OPUS_GET_COMPLEXITY_REQUEST" int
let set_inband_fec_request = constant "OPUS_SET_INBAND_FEC_REQUEST" int
let get_inband_fec_request = constant "OPUS_GET_INBAND_FEC_REQUEST" int
let set_packet_loss_perc_request = constant "OPUS_SET_PACKET_LOSS_PERC_REQUEST" int
let get_packet_loss_perc_request = constant "OPUS_GET_PACKET_LOSS_PERC_REQUEST" int
let set_dtx_request = constant "OPUS_SET_DTX_REQUEST" int
let get_dtx_request = constant "OPUS_GET_DTX_REQUEST" int
let set_vbr_constraint_request = constant "OPUS_SET_VBR_CONSTRAINT_REQUEST" int
let get_vbr_constraint_request = constant "OPUS_GET_VBR_CONSTRAINT_REQUEST" int
let set_force_channels_request = constant "OPUS_SET_FORCE_CHANNELS_REQUEST" int
let get_force_channels_request = constant "OPUS_GET_FORCE_CHANNELS_REQUEST" int
let set_signal_request = constant "OPUS_SET_SIGNAL_REQUEST" int
let get_signal_request = constant "OPUS_GET_SIGNAL_REQUEST" int
let get_lookahead_request = constant "OPUS_GET_LOOKAHEAD_REQUEST" int
let reset_state = constant "OPUS_RESET_STATE" int
let get_sample_rate_request = constant "OPUS_GET_SAMPLE_RATE_REQUEST" int
let get_final_range_request = constant "OPUS_GET_FINAL_RANGE_REQUEST" int
let get_pitch_request = constant "OPUS_GET_PITCH_REQUEST" int
let set_gain_request = constant "OPUS_SET_GAIN_REQUEST" int
let get_gain_request = constant "OPUS_GET_GAIN_REQUEST" int
let set_lsb_depth_request = constant "OPUS_SET_LSB_DEPTH_REQUEST" int
let get_lsb_depth_request = constant "OPUS_GET_LSB_DEPTH_REQUEST" int
let get_last_packet_duration_request = constant "OPUS_GET_LAST_PACKET_DURATION_REQUEST" int
let set_expert_frame_duration_request = constant "OPUS_SET_EXPERT_FRAME_DURATION_REQUEST" int
let get_expert_frame_duration_request = constant "OPUS_GET_EXPERT_FRAME_DURATION_REQUEST" int
let set_prediction_disabled_request = constant "OPUS_SET_PREDICTION_DISABLED_REQUEST" int
let get_prediction_disabled_request = constant "OPUS_GET_PREDICTION_DISABLED_REQUEST" int
let set_phase_inversion_disabled_request = constant "OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST" int
let get_phase_inversion_disabled_request = constant "OPUS_GET_PHASE_INVERSION_DISABLED_REQUEST" int
let get_in_dtx_request = constant "OPUS_GET_IN_DTX_REQUEST" int
end
include (struct
type +'a handle = unit ptr
let handle: 'a handle typ = ptr void
end : sig
type +'a handle
val handle: 'a handle typ
end
)
module Encoder = struct
type t = [`enc] handle
let t: t typ = handle
end
module Decoder = struct
type t = [`dec] handle
let t: t typ = handle
end
end
(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}
-pkg
ctypes
-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's
good 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 = struct
type decoder = [`dec] handle
let%c t = ptr void
external 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 * gc
and gc = unit ptr
let _dec = function | Own e | C (e, _) -> e
let create ?(samplerate=48000) ?(channels=`stereo) () =
let channels = match channels with | `stereo -> 2 | `mono -> 1 in
let err, dec = match own with
| false ->
let err = allocate int (-1) in
let dec = opus_decoder_create ~fs:Int32.(of_int samplerate) ~channels err in
let gc =
allocate_n ~finalise:(fun _ -> opus_decoder_destroy dec)
~count:0 void
in
!@err, C (dec, gc)
| true ->
let dec =
allocate_n ~count:(opus_decoder_get_size channels) uchar
|> coerce (ptr uchar) (ptr void)
in
let err = opus_decoder_init dec ~fs:Int32.(of_int samplerate) ~channels in
err, Own dec
in
Error.wrap dec err
|> Result.map (fun dec -> {
dec;
samplerate;
channels;
})
let size { channels; _ } = opus_decoder_get_size channels
let _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) in
let buf = BA1.sub buf buf_off (match buf_len with | None -> (BA1.dim buf - buf_off) | Some l -> l) in
let fs = t.samplerate / 1000 * framesize in
if BA1.dim pcm < (fs * t.channels) then
raise (Invalid_argument "given pcm frame does not have enough samples");
let buf_p =
(bigarray_start array1 buf) |>
coerce (ptr char) (ptr uchar)
in
let len = Int32.of_int @@ BA1.dim buf in
let 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)
in
match 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 pcm
let decode t ?fec ?off ?len buf =
let framesize = 120 in
let 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 pcm
let 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 pcm
let decode_float t ?fec ?off ?len buf =
let framesize = 120 in
let 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 pcm
let ctl t req = CTL.request ~ctl_fn:"opus_decoder_ctl" (_dec t.dec) req
end
module C = Opus_c
module T = Opus_c.Types
open Ctypes
let mem = `Ocaml
module Error = struct
type t = T.Error.t
let 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_string
let 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_string
let pp fmt t = Format.fprintf fmt "%s" (show t)
end
type nonrec 'a result = ('a, Error.t) result
type framesize = T.Framesize.t
type bitrate = T.Bitrate.t
type bandwidth = T.Bandwidth.t
type application = T.Application.t
type signal = T.Signal.t
module CTL = struct
type enc = [`enc]
type dec = [`dec]
type 'a both = [< `enc | `dec] as 'a
type 'a handle = 'a T.handle
type ('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) t
let _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_request
in
Int32.of_int o
module R = struct
type _ arg =
| Arg: 'a * 'a conv -> 'a arg
and _ conv =
| Conv: ('a -> int32) * (int32 -> 'a) -> 'a conv
type ('i, 'o) def =
| Set: 'i arg -> ('i, unit) def
| Get: 'o conv -> (unit, 'o) def
let fn_0 ~code ~handle name =
let fn = Foreign.foreign name (T.handle @-> int32_t @-> returning int) in
fn 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) in
fn handle code (ser a) |> Error.wrap ()
| Get (Conv (_, des)) ->
let fn = Foreign.foreign name (T.handle @-> int32_t @-> ptr int32_t @-> returning int) in
let v = allocate int32_t 0l in
fn handle code v |> Error.wrap (des !@v)
let (%>) a b x = b @@ a x
let set arg = Set arg
let get conv = Get conv
let 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_c
let bandwidth =
let to_int = function | #bandwidth as b -> T.Bandwidth.to_c b | `Auto -> T.auto in
let of_int = function | n when n = T.auto -> `Auto | n -> T.Bandwidth.of_c n in
conv to_int of_int
let bitrate =
let to_int = function
| `Auto -> T.auto
| #bitrate as br -> T.Bitrate.to_c br
in
let of_int = function
| n when n = T.auto -> `Auto
| br -> T.Bitrate.of_c br
in
conv to_int of_int
let signal =
let to_int = function
| `Auto -> T.auto
| #signal as s -> T.Signal.to_c s
in
let of_int = function
| s when s = T.auto -> `Auto
| s -> T.Signal.of_c s
in
conv to_int of_int
let channels =
let to_int = function
| `Auto -> T.auto
| `Mono -> 1
| `Stereo -> 2
in
let of_int = function
| n when n = T.auto -> `Auto
| 1 -> `Mono
| 2 -> `Stereo
| _ -> assert false
in
conv to_int of_int
let application = conv T.Application.to_c T.Application.of_c
let framesize = conv T.Framesize.to_c T.Framesize.of_c
end
let request: type a b. ctl_fn:string -> a handle -> (a, b) t -> b result
= fun ~ctl_fn handle req ->
let code = _code req in
match 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)
end
module BA = Bigarray
module BA1 = Bigarray.Array1
type bigstring = (char, BA.int8_unsigned_elt, BA.c_layout) BA1.t
type s16frame = (int, BA.int16_signed_elt, BA.c_layout) BA1.t
type f32frame = (float, BA.float32_elt, BA.c_layout) BA1.t
module Encoder = struct
type encoder = T.Encoder.t
type t = {
enc: enc;
samplerate: int;
channels: int;
app: application;
}
and enc = | Own of encoder | C of encoder * gc
and gc = unit ptr
type packet = [ `Packet of bigstring | `DTX ]
let recommended_max_size = 4000
let _enc = function | Own e | C (e, _) -> e
let create ?(samplerate=48000) ?(channels=`stereo) ?(application=`Audio) () =
let channels = match channels with | `stereo -> 2 | `mono -> 1 in
let app = T.Application.to_c application in
let err, enc = match mem with
| `C ->
let err = allocate int (-1) in
let enc = C.Encoder.create Int32.(of_int samplerate) channels app err in
let gc =
allocate_n ~finalise:(fun _ -> C.Encoder.destroy enc)
~count:0 void
in
!@err, C (enc, gc)
| `Ocaml ->
let enc =
allocate_n ~count:(C.Encoder.get_size channels) uchar
|> coerce (ptr uchar) (ptr void)
in
let err = C.Encoder.init enc Int32.(of_int samplerate) channels app in
err, Own (Obj.magic enc)
in
Error.wrap enc err
|> Result.map (fun enc -> {
enc;
samplerate;
channels;
app=application;
})
let size { channels; _ } = C.Encoder.get_size channels
let _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) in
let buf = BA1.sub buf buf_off (BA1.dim buf - buf_off) in
let 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 buf
in
let fs = t.samplerate / 1000 * duration in
if BA1.dim pcm < (fs * t.channels) then
raise (Invalid_argument "given pcm frame does not have enough samples");
let buf_p =
(bigarray_start array1 buf) |>
coerce (ptr char) (ptr uchar)
in
let 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)
in
match 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 buf
let 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 buf
let encode_blit_float t ?pcm_off ?duration pcm ?buf_off ?max_size buf =
_encode_blit t ?pcm_off ?duration pcm ?buf_off ?max_size buf
let 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 buf
let ctl t req = CTL.request ~ctl_fn:"opus_encoder_ctl" (_enc t.enc) req
end
module Decoder = struct
type decoder = T.Decoder.t
type t = {
dec: dec;
samplerate: int;
channels: int;
}
and dec = | Own of decoder | C of decoder * gc
and gc = unit ptr
let _dec = function | Own e | C (e, _) -> e
let create ?(samplerate=48000) ?(channels=`stereo) () =
let channels = match channels with | `stereo -> 2 | `mono -> 1 in
let err, dec = match mem with
| `C ->
let err = allocate int (-1) in
let dec = C.Decoder.create Int32.(of_int samplerate) channels err in
let gc =
allocate_n ~finalise:(fun _ -> C.Decoder.destroy dec)
~count:0 void
in
!@err, C (dec, gc)
| `Ocaml ->
let dec =
allocate_n ~count:(C.Decoder.get_size channels) uchar
|> coerce (ptr uchar) (ptr void)
in
let err = C.Decoder.init dec Int32.(of_int samplerate) channels in
err, Own (Obj.magic dec)
in
Error.wrap dec err
|> Result.map (fun dec -> {
dec;
samplerate;
channels;
})
let size { channels; _ } = C.Decoder.get_size channels
let _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) in
let buf = BA1.sub buf buf_off (match buf_len with | None -> (BA1.dim buf - buf_off) | Some l -> l) in
let fs = t.samplerate / 1000 * framesize in
if BA1.dim pcm < (fs * t.channels) then
raise (Invalid_argument "given pcm frame does not have enough samples");
let buf_p =
(bigarray_start array1 buf) |>
coerce (ptr char) (ptr uchar)
in
let len = Int32.of_int @@ BA1.dim buf in
let 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)
in
match 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 pcm
let decode t ?fec ?off ?len buf =
let framesize = 120 in
let 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 pcm
let 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 pcm
let decode_float t ?fec ?off ?len buf =
let framesize = 120 in
let 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 pcm
let ctl t req = CTL.request ~ctl_fn:"opus_decoder_ctl" (_dec t.dec) req
end
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 result
end
module Decoder: sig
type t
val create:
?samplerate:int ->
?channels:[`mono | `stereo] ->
unit ->
t result
val size: t -> int
val decode_blit:
t ->
?fec:bool ->
?buf_off:int ->
?buf_len:int ->
bigstring ->
?pcm_off:int ->
?framesize:int ->
s16frame ->
s16frame result
val decode:
t ->
?fec:bool ->
?off:int ->
?len:int ->
bigstring ->
s16frame result
val decode_blit_float:
t ->
?fec:bool ->
?buf_off:int ->
?buf_len:int ->
bigstring ->
?pcm_off:int ->
?framesize:int ->
f32frame ->
f32frame result
val decode_float:
t ->
?fec:bool ->
?off:int ->
?len:int ->
bigstring ->
f32frame result
val ctl: t -> ([`dec], 'a) CTL.t -> 'a result