package syto
Install
dune-project
Dependency
Authors
Maintainers
Sources
sha256=4af63e149ba034dfd123ad452712d2c2dc21679c5547af671c48eb07a14e9c54
sha512=dcd7c47d117a31b5549727ec9c86902fa139deaaa1481ec0505a6f95cf4cbd5361f382ee2ceedc8ad4e402a46e3f2e18079fe48a8b20ef4113e6ca2d03d80a3d
doc/README.html
syto
POSIX fnmatch(3) filename pattern matching for OCaml.
Installation
opam install sytoMinimum OCaml version: 4.14.
Examples
All examples run in utop after #require "syto";;.
Literal and wildcard
Syto.match_pattern ~pattern:"*.ml" ~name:"foo.ml";;
(* - : bool = true *)
Syto.filter ~pattern:"*.ml" ["foo.ml"; "bar.txt"; "baz.ml"];;
(* - : string list = ["foo.ml"; "baz.ml"] *)PATHNAME — slashes are path boundaries
* and ? do not cross / when PATHNAME is set.
(* Without PATHNAME: * matches anything including / *)
Syto.match_pattern ~pattern:"*.ml" ~name:"src/foo.ml";;
(* - : bool = true *)
(* With PATHNAME: * stops at / *)
Syto.match_pattern ~flags:[`PATHNAME] ~pattern:"*.ml" ~name:"src/foo.ml";;
(* - : bool = false *)
Syto.match_pattern ~flags:[`PATHNAME] ~pattern:"src/*.ml" ~name:"src/foo.ml";;
(* - : bool = true *)PERIOD — dotfiles require an explicit dot
With PERIOD, a name component beginning with . is matched only by a pattern with a literal . at that position. Wildcards do not match it.
Syto.match_pattern ~flags:[`PERIOD] ~pattern:"*" ~name:".gitignore";;
(* - : bool = false *)
Syto.match_pattern ~flags:[`PERIOD] ~pattern:".*" ~name:".gitignore";;
(* - : bool = true *)
(* PERIOD applies after each / when PATHNAME is also set *)
Syto.match_pattern ~flags:[`PATHNAME; `PERIOD]
~pattern:"src/*" ~name:"src/.hidden";;
(* - : bool = false *)CASEFOLD — case-insensitive matching (ASCII)
Syto.match_pattern ~flags:[`CASEFOLD] ~pattern:"*.ML" ~name:"foo.ml";;
(* - : bool = true *)
Syto.filter ~flags:[`CASEFOLD] ~pattern:"readme*"
["README.md"; "readme.txt"; "notes.md"];;
(* - : string list = ["README.md"; "readme.txt"] *)GLOBSTAR — recursive path matching
With PATHNAME and GLOBSTAR, ** matches zero or more path components.
let flags = [`PATHNAME; `GLOBSTAR];;
Syto.match_pattern ~flags ~pattern:"src/**/*.ml" ~name:"src/lib/foo.ml";;
(* - : bool = true *)
Syto.match_pattern ~flags ~pattern:"src/**/*.ml" ~name:"src/foo.ml";;
(* - : bool = true — ** matches zero components *)
Syto.match_pattern ~flags ~pattern:"a/**" ~name:"a";;
(* - : bool = false — trailing ** requires at least one boundary *)
Syto.filter ~flags ~pattern:"**/*.ml"
["src/a.ml"; "src/lib/b.ml"; "other.txt"];;
(* - : string list = ["src/a.ml"; "src/lib/b.ml"] *)Flags
Flag | POSIX? | Effect |
|---|---|---|
| yes |
|
| yes |
|
| yes | a leading |
| no (GNU) | ASCII A–Z folded to a–z before comparison |
| no (bash) |
|
Flags may be combined freely. GLOBSTAR without PATHNAME makes ** behave identically to *.
filter vs match_pattern
Syto.filter ~pattern names and List.filter (fun n -> Syto.match_pattern ~pattern ~name:n) names produce the same result. Use filter when applying one pattern to many names; it parses the pattern once. Use match_pattern for one-off checks or when testing multiple patterns against one name.
POSIX deviations
- Matching operates on UTF-8 codepoints, not locale-dependent bytes.
?matches one Unicode codepoint. - Collating elements
[.ch.]and equivalence classes[=a=]raiseError. [a-b-c]raisesError; POSIX parses it as rangea-bplus literal-c.CASEFOLDfolds ASCII A–Z only. Cyrillic and other non-ASCII letters are compared by codepoint value.GLOBSTARis a non-POSIX extension (common in bash and gitignore).
Documentation
Extended examples and integration patterns: docs/guide.md.
API reference: dune build @doc or the opam package documentation.
License
ISC. See LICENSE.