package lsp

  1. Overview
  2. Docs
LSP protocol implementation in OCaml

Install

Dune Dependency

Authors

Maintainers

Sources

jsonrpc-1.4.0.tbz
sha256=fd138e6c4fcff32c6d15eb66cc9391b7e1183717a6d1a47c688c7f6d320a159f
sha512=567a73b3c10bb59c5a4d4e8291d1aeefdfd34438a95313fba8a485638294ca5fb8034334719631243c304d3328c27afa90dfd564fdb1e7390507a06db3a4ad03

doc/src/lsp.fiber_unix/fiber_stream.ml.html

Source file fiber_stream.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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
module In = struct
  type 'a t = unit -> 'a option Fiber.t

  let create f = f

  let read t = t ()

  let empty () () = Fiber.return None

  let of_list xs =
    let xs = ref xs in
    fun () ->
      match !xs with
      | [] -> Fiber.return None
      | x :: xs' ->
        xs := xs';
        Fiber.return (Some x)

  let rec filter_map t ~f () =
    let open Fiber.O in
    let* next = read t in
    match next with
    | None -> Fiber.return None
    | Some x -> (
      match f x with
      | None -> filter_map t ~f ()
      | Some y -> Fiber.return (Some y) )

  let map t ~f = filter_map t ~f:(fun x -> Some (f x))

  let filter (type a) (t : a t) ~f : a t =
    filter_map t ~f:(fun x ->
        if f x then
          Some x
        else
          None)

  let rec sequential_iter t ~f =
    let open Fiber.O in
    let* e = t () in
    match e with
    | None -> Fiber.return ()
    | Some x ->
      let* () = f x in
      sequential_iter t ~f
end

module Out = struct
  type 'a t = 'a option -> unit Fiber.t

  let create f = f

  let write f x = f x

  let of_ref ref = function
    | None -> Fiber.return ()
    | Some x -> Fiber.return (ref := x :: !ref)

  let null () _ = Fiber.return ()
end

let connect i o =
  let open Fiber.O in
  let rec go () =
    let* a = In.read i in
    let* () = Out.write o a in
    match a with
    | None -> Fiber.return ()
    | Some _ -> go ()
  in
  go ()

let supply i o =
  let open Fiber.O in
  let rec go () =
    let* a = In.read i in
    match a with
    | None -> Fiber.return ()
    | Some _ ->
      let* () = Out.write o a in
      go ()
  in
  go ()

let pipe () =
  let mvar = Fiber.Mvar.create () in
  let i = In.create (fun () -> Fiber.Mvar.read mvar) in
  let o = Out.create (fun x -> Fiber.Mvar.write mvar x) in
  (i, o)
OCaml

Innovation. Community. Security.