package ppx_factory

  1. Overview
  2. Docs
PPX to derive factories and default values

Install

Dune Dependency

Authors

Maintainers

Sources

ppx_factory-0.2.0.tbz
sha256=23a90da63c9ab5078b0582805bbdaabf440cd8a8ac32abd1ad16d2dbac27b891
sha512=5d1e9f14d7cecc6617a9bc4d4438648230e05c167b7fd7f88449d94d5ab237561c0fc1f62fd628a6af0d77094c7f167d18910676e20ce3659a5383c38f2d4806

doc/src/ppx_factory._lib/util.ml.html

Source file util.ml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
open Ppxlib

let affix_from_type_name ~kind type_name =
  match type_name, kind with
  | "t", _ -> ""
  | _, `Suffix -> "_" ^ type_name
  | _, `Prefix -> type_name ^ "_"

let constr_from_type_param ~loc (core_type, _variance) =
  {core_type with ptyp_loc = loc; ptyp_attributes = []}

let core_type_from_type_decl ~loc {ptype_name; ptype_params; _} =
  let constr = List.map (constr_from_type_param ~loc) ptype_params in
  let type_lident = {txt = Lident ptype_name.txt; loc} in
  Ast_builder.Default.ptyp_constr ~loc type_lident constr

let is_ocamldep ctxt =
  let tool_name = Expansion_context.Deriver.tool_name ctxt in
  String.equal tool_name "ocamldep"

module Expr = struct
  let var ~loc var_name = Ast_builder.Default.pexp_ident ~loc {txt = Lident var_name; loc}
  let constructor ~loc ~constructor_name expr =
    Ast_builder.Default.pexp_construct ~loc {txt = Lident constructor_name; loc} expr
end

module List_ = struct
  exception Exit

  (* Thanks c-cube's containers *)
  let all_ok l =
    let err = ref None in
    try Ok (List.map (function Ok x -> x | Error e -> err := Some e; raise Exit) l)
    with Exit ->
    match !err with
    | Some e -> Error e
    | None -> assert false

  let rec find_ok ~f = function
    | [] -> Error `Empty
    | [last] ->
      ( match f last with
        | Ok _ as ok -> ok
        | Error err -> Error (`Last err)
      )
    | hd::tl ->
      ( match f hd with
        | Ok _ as ok -> ok
        | Error _ -> find_ok ~f tl
      )
end

module Result_ = struct
  let (>|=) res f =
    match res with
    | Ok x -> Ok (f x)
    | Error _ as err -> err
end
OCaml

Innovation. Community. Security.