1 # coding: utf-8
2 # frozen_string_literal: true
3
4
5
6 module Umu
7
8 module Value
9
10 module Core
11
12 class Dir < Object
13 attr_reader :obj
14
15
16 def initialize(obj)
17 ASSERT.kind_of obj, ::Dir
18
19 super()
20
21 @obj = obj
22 end
23
24
25 def to_s
26 format "#Dir<\"%s\">", self.obj.path
27 end
28
29
30 define_instance_method(
31 :meth_seen,
32 :seen, [],
33 [], VC::Unit
34 )
35 def meth_seen(_loc, _env, _event)
36 self.obj.close
37
38 VC.make_unit
39 end
40
41
42 define_instance_method(
43 :meth_to_string,
44 :'to-s', [],
45 [], VCA::String
46 )
47 def meth_to_string(_loc, _env, _event)
48 VC.make_string self.obj.path
49 end
50
51
52 FN_DEST = lambda { |dir|
53 s = dir.obj.read
54 unless s
55 raise ::StopIteration
56 end
57
58 str_val = VC.make_string s.chomp
59
60 VC.make_some(
61 VC.make_tuple(
62 str_val,
63 VC.make_enumerator(dir, FN_DEST)
64 )
65 )
66 }
67
68 define_instance_method(
69 :meth_each,
70 :'each', [],
71 [], VCM::Enum::Abstract
72 )
73 def meth_each(_loc, _env, _event)
74 VC.make_enumerator self, FN_DEST
75 end
76 end
77 Dir.freeze
78
79
80 module_function
81
82 def make_dir(obj)
83 ASSERT.kind_of obj, ::Dir
84
85 Dir.new(obj).freeze
86 end
87
88 end # Umu::Value::Core
89
90 end # Umu::Value
91
92 end # Umu