OCamlでCompositeパターン

30分プログラム、その552。CompositeパターンをOCamlでやってみる。
OCamlのOはオブジェクトのO、オブジェクト指向と言えばデザインパターンということで、OCamlでCompositeパターンを実装してみた。
バリアント使えと言うのは野暮ってもんです。

使い方

let root = new directory
let bin  = new directory
let tmp  = new directory
let usr  = new directory
let _ =
  root#add (bin :> entry);
  root#add (tmp :> entry);
  root#add (usr :> entry);
  bin#add (new file 1000);
  bin#add (new file 2000)

let _ =
  Printf.printf "%d\n" root#get_size (* 3000 *)

ソースコード

let (@@) f g = f g

class virtual entry = object
  method virtual get_size : int
end

class file size = object
  inherit entry

  method get_size = size
end

class directory = object(self)
  inherit entry

  val mutable children = []

  method add (x : entry) =
    children <- x::children

  method get_size =
    let sum =
      List.fold_left (+) 0 in
      sum @@ List.map (fun x -> x#get_size ) children
end

(* Sample *)
let root = new directory
let bin  = new directory
let tmp  = new directory
let usr  = new directory
let _ =
  root#add (bin :> entry);
  root#add (tmp :> entry);
  root#add (usr :> entry);
  bin#add (new file 1000);
  bin#add (new file 2000);
  Printf.printf "%d\n" root#get_size