aboutsummaryrefslogtreecommitdiffstats
path: root/lib/protocols/Directory.ml
blob: fd45949fd4e13dcad2f1c0c34894c5d2d30a68bd (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class type implementation = object
  method list : (string BatFingerTree.t, Concepts.Condition.condition) result
  method find : string -> (Handle.t option, Concepts.Condition.condition) result
end

type Handle.protocol += Directory of implementation
type t = implementation

let make impl = Directory (impl :> implementation)
let from handle = Handle.into handle (function Directory impl -> Some impl | _ -> None)
let list i = Handle.invoke i (fun o -> o#list)
let find i name = Handle.invoke i (fun o -> o#find name)

let children directory =
  let open Utilities.Result in
  let* listing = Handle.require from directory in
  let* names = list listing in
  names
  |> BatFingerTree.map (fun name ->
      let* found = find listing name in
      Ok (Option.map (fun child -> name, child) found) )
  |> Utilities.FingerTree.sequence
  |> Result.map (Utilities.FingerTree.filter_map Fun.id)