10 my ($self, $ometa) = @_;
11 +{ %$ometa, width_left => $ometa->{width_left} - length $self->indent_by };
15 my ($self, $to_indent) = @_;
16 $to_indent =~ s/^/${\$self->indent_by}/mg;
21 my ($self, $thing) = @_;
22 $self->_fmt($thing, { width_left => $self->max_width })."\n";
26 my ($self, $thing, $meta) = @_;
27 return '{}' unless defined($thing);
28 return $thing unless ref($thing);
29 my $type = join'_', split '::', lc +(ref($thing) =~ /^(?:DX::)?(.*)/)[0];
30 $self->${\"_fmt_${type}"}($thing, $meta);
34 my ($self, $dict, $meta) = @_;
35 my $chunks = $self->_fmt_pairs([
36 map [ $_, $dict->get_member_at($_) ], $dict->index_list
38 return '{{ }}' unless $chunks =~ /\S/;
39 s/^\s+//, s/\n\s+/ /g for (my $maybe = $chunks);
40 return "{{ ${maybe} }}" if length($maybe) < $meta->{width_left};
45 my ($self, $pairs, $ometa) = @_;
46 my $imeta = $self->_inner_meta($ometa);
47 $self->_indent_one(join "\n", map {
48 join ' ', map $self->_fmt($_, $imeta), @$_
52 sub _fmt_value_string {
53 my ($self, $string) = @_;
54 # TODO: multiline handling
55 my $val = $string->string_value;
56 if ($val =~ /^\w+$/) {
63 sub _fmt_value_number { $_[1]->number_value }
65 sub _fmt_value_true { 'true' }
67 sub _fmt_value_false { 'false' }
69 sub _fmt_value_unset { 'unset' }
72 my ($self, $pairs, $meta) = @_;
73 my $chunks = $self->_fmt_pairs($pairs, $meta);
74 return '{ }' unless $chunks =~ /\S/;
75 s/^\s+//, s/\n\s+/ /g for (my $maybe = $chunks);
76 return "{ ${maybe} }" if length($maybe) < $meta->{width_left};
81 my ($self, $hyp, $meta) = @_;
83 map [ $_ => $hyp->$_ ],
84 qw(actions outstanding_propositions resolved_propositions scope)
89 my ($self, $ary, $ometa) = @_;
90 my $imeta = $self->_inner_meta($ometa);
91 my $chunks = $self->_indent_one(
92 join "\n", map $self->_fmt($_, $imeta), @$ary
94 return '{ }' unless $chunks =~ /\S/;
99 my ($self, $glob, $meta) = @_;
100 return ((''.*$glob) =~ /::([A-Z_]+)$/)[0];
103 sub _fmt_action_setvalue {
104 my ($self, $action, $meta) = @_;
105 $self->_fmt_action_generic(SetValue => $action, $meta);
108 sub _fmt_action_addvalue {
109 my ($self, $action, $meta) = @_;
110 $self->_fmt_action_generic(AddValue => $action, $meta);
113 sub _fmt_action_bindvalue {
114 my ($self, $action, $meta) = @_;
115 my $path = join '.', map $self->_fmt($_, $meta), @{$action->target_path};
116 my $bound_path = join '.',
117 map $self->_fmt($_, $meta),
120 ->inner_action_builder
122 join ' ', BindValue => $path, $bound_path;
125 sub _fmt_action_setboundvalue {
126 my ($self, $action, $meta) = @_;
127 $self->_fmt_action_generic(SetBoundValue => $action, $meta);
130 sub _fmt_action_generic {
131 my ($self, $name, $action, $meta) = @_;
132 my $path = join '.', map $self->_fmt($_, $meta), @{$action->target_path};
133 join ' ', $name, $path, $self->_fmt($action->new_value, $meta);
136 sub _fmt_resolvedpropositionset {
137 my ($self, $rps, $meta) = @_;
141 map bless([ @$_ ], 'DX::Dependency'),
143 @{$rps->dependencies_for($_)}
145 } @{$rps->propositions},
149 sub _fmt_dependency {
150 my ($self, $dep, $meta) = @_;
151 '{ '.join(' ', map $self->_fmt($_, $meta), @$dep).' }'
154 sub _fmt_proposition {
155 my ($self, $prop, $meta) = @_;
158 map $self->_fmt($_, $meta),
159 map +((!ref($_) and $prop->introduced_names->{$_}) ? "?$_" : $_),
164 my ($self, $scope, $meta) = @_;
166 [ W => $scope->globals ],
167 map [ $_ => $scope->locals->[$_] ], 0..$#{$scope->locals}
171 sub _fmt_searchstate {
172 my ($self, $ss, $meta) = @_;
174 [ alternatives => '{...}' ],
175 [ current_hypothesis => $ss->current_hypothesis ],