package git
Git format and protocol in pure OCaml
Install
Dune Dependency
Authors
Maintainers
Sources
git-3.13.0.tbz
sha256=f7cc36026cdefc1f9837f10d7d26f457c236cb21547fcad210e71483561b55d3
sha512=728f21c3483bdead9420767cb3e57901be1cff428fceb814be3cad817b2d78511d35f559962469e85d3919c59577884d353cb883ac749e6e2b92fb7d0deec4f4
doc/src/smart/state.ml.html
Source file state.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 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181
let ( <.> ) f g x = f (g x) type ('a, 'err) t = | Read of { buffer : bytes; off : int; len : int; k : int -> ('a, 'err) t; eof : unit -> ('a, 'err) t; } | Write of { buffer : string; off : int; len : int; k : int -> ('a, 'err) t } | Return of 'a | Error of 'err module type CONTEXT = sig type t type encoder type decoder val pp : Capability.t Fmt.t -> t Fmt.t val encoder : t -> encoder val decoder : t -> decoder end module type VALUE = sig type 'a send type 'a recv type error type encoder type decoder val encode : encoder -> 'a send -> 'a -> (unit, error) t val decode : decoder -> 'a recv -> ('a, error) t end module Context = struct type capabilities = { client_caps : Capability.t list; server_caps : Capability.t list; } type t = { encoder : Pkt_line.Encoder.encoder; decoder : Pkt_line.Decoder.decoder; mutable capabilities : capabilities; } type encoder = Pkt_line.Encoder.encoder type decoder = Pkt_line.Decoder.decoder let pp _pp_ctx _ppf _t = () let make ~client_caps = let capabilities = { client_caps; server_caps = [] } in { encoder = Pkt_line.Encoder.create (); decoder = Pkt_line.Decoder.create (); capabilities; } let with_decoder ~client_caps decoder = { encoder = Pkt_line.Encoder.create (); decoder; capabilities = { client_caps; server_caps = [] }; } let encoder { encoder; _ } = encoder let decoder { decoder; _ } = decoder let capabilities { capabilities; _ } = capabilities let replace_server_caps ctx server_caps = ctx.capabilities <- { ctx.capabilities with server_caps } let { capabilities = { client_caps; server_caps }; _ } cap = let is_cap_in caps = List.exists (fun c -> Capability.equal c cap) caps in is_cap_in client_caps && is_cap_in server_caps end module Scheduler (Context : CONTEXT) (Value : VALUE with type encoder = Context.encoder and type decoder = Context.decoder) = struct type error = Value.error let bind : ('a, 'err) t -> f:('a -> ('b, 'err) t) -> ('b, 'err) t = let rec bind' m ~f = match m with | Return v -> f v | Error _ as err -> err | Read ({ k; eof; _ } as rd) -> Read { rd with k = bind' ~f <.> k; eof = bind' ~f <.> eof } | Write ({ k; _ } as wr) -> Write { wr with k = bind' ~f <.> k } in bind' let return v = Return v let fail error = Error error let map m ~f = bind m ~f:(fun v -> return (f v)) let ( >>= ) m f = bind m ~f let ( >|= ) m f = map m ~f let ( let* ) m f = m >>= f let ( let+ ) m f = m >|= f let reword_error f x = let rec map_error = function | Return _ as r -> r | Error err -> Error (f err) | Read ({ k; eof; _ } as rd) -> Read { rd with k = map_error <.> k; eof = map_error <.> eof } | Write ({ k; _ } as wr) -> Write { wr with k = map_error <.> k } in map_error x (* Is slightly different from [m |> reword_error ~f >>= f1]. The places where [apply] used currently the alternative code above would be sufficient, but that would end up in twice the number of function calls *) let apply m ~bind_ret ~bind_err = let rec apply' = function | Return r -> bind_ret r | Error err -> bind_err err | Read ({ k; eof; _ } as rd) -> Read { rd with k = apply' <.> k; eof = apply' <.> eof } | Write ({ k; _ } as wr) -> Write { wr with k = apply' <.> k } in apply' m let encode : type a. Context.t -> a Value.send -> a -> (Context.t -> ('b, [> `Protocol of error ]) t) -> ('b, [> `Protocol of error ]) t = fun ctx w v k -> let encoder = Context.encoder ctx in Value.encode encoder w v |> apply ~bind_ret:(fun () -> k ctx) ~bind_err:(fun err -> Error (`Protocol err)) let send : type a. Context.t -> a Value.send -> a -> (unit, [> `Protocol of error ]) t = fun ctx w x -> encode ctx w x (fun _ctx -> Return ()) let decode : type a. Context.t -> a Value.recv -> (Context.t -> a -> ('b, [> `Protocol of error ]) t) -> ('b, [> `Protocol of error ]) t = fun ctx w k -> let decoder = Context.decoder ctx in Value.decode decoder w |> apply ~bind_ret:(fun v -> k ctx v) ~bind_err:(fun e -> Error (`Protocol e)) let recv : type a. Context.t -> a Value.recv -> (a, [> `Protocol of error ]) t = fun ctx w -> decode ctx w (fun _ctx v -> Return v) let error_msgf fmt = Fmt.kstr (fun err -> Error (`Msg err)) fmt module Infix = struct let ( >>= ) = ( >>= ) let ( >|= ) = ( >|= ) let return = return let fail = fail end module Syntax = struct let ( let* ) = ( let* ) let ( let+ ) = ( let+ ) let return = return let fail = fail end end
sectionYPositions = computeSectionYPositions($el), 10)"
x-init="setTimeout(() => sectionYPositions = computeSectionYPositions($el), 10)"
>