show dependencies before backtracking
[scpubgit/DX.git] / lib / DX / Utils.pm
CommitLineData
9d759b64 1package DX::Utils;
2
3use strictures 2;
4use Exporter 'import';
5
efad53c4 6my @const = (
d5511afa 7 my @dep_types = qw(EXISTENCE_OF TYPE_OF INDICES_OF CONTENTS_OF),
efad53c4 8 my @ev_types = qw(VALUE_SET VALUE_EXISTS),
9);
9d759b64 10
efad53c4 11our @EXPORT_OK = (
12 @const,
29daa554 13 (my @builders = qw(rspace rstrat res string number dict proposition)),
4db57c04 14 'deparse', '*trace', 'expand_deps', 'format_deps',
efad53c4 15);
16
17our %EXPORT_TAGS = (
18 all => \@EXPORT_OK,
19 dep_types => \@dep_types,
20 event_types => \@ev_types,
21 builders => \@builders,
22);
23
24require constant;
25
26# use constant INDICES_OF => \*INDICES_OF;
27
28constant->import(+{
29 map {; no strict 'refs'; $_ => \*$_ } @const
30});
31
d5511afa 32# $EXISTENCE_OF = 1, ...
efad53c4 33
34do { no strict 'refs'; ${$dep_types[$_-1]} = $_ } for 1..@dep_types;
35
36# VALUE_EXISTS needs to trigger indices checks on its parent
37
38our $VALUE_EXISTS = 1;
39
40# VALUE_EXISTS triggers all types, VALUE_SET all but EXISTENCE_OF
41
d5511afa 42our @VALUE_EXISTS = (EXISTENCE_OF(), TYPE_OF(), INDICES_OF(), CONTENTS_OF());
43our @VALUE_SET = (TYPE_OF(), INDICES_OF(), CONTENTS_OF());
9d759b64 44
bcee3a69 45sub trace { }
372a400c 46
7248abc9 47sub _expand_dep {
48 my ($type, @path) = @{$_[0]};
49 my @expanded = map {
50 ref() ? @{$_->value_path or return ()} : $_
51 } @path;
52 return [ $type, @expanded ];
53}
54
c99dbb05 55sub expand_deps {
7248abc9 56 [ map _expand_dep($_), @{$_[0]} ]
57}
58
4db57c04 59sub format_deps {
60 [ block => [
61 map [ statement => [
62 [ symbol => (split '::', ${$_->[0]})[-1] ],
63 [ value_path => [ @{$_}[1..$#$_] ] ]
64 ] ], @{$_[0]}
65 ] ]
66}
67
7f385fb2 68sub rspace {
69 require DX::ResolutionSpace;
70 DX::ResolutionSpace->new(@_);
71}
72
73sub rstrat {
74 require DX::ResolutionStrategy;
75 DX::ResolutionStrategy->new(@_);
76}
77
78sub res {
79 require DX::Resolution;
80 DX::Resolution->new(@_);
81}
82
9d759b64 83sub string {
3e465d5d 84 require DX::Value::String;
9d759b64 85 DX::Value::String->new(string_value => $_[0])
86}
87
88sub number {
3e465d5d 89 require DX::Value::Number;
9d759b64 90 DX::Value::Number->new(number_value => $_[0]);
91}
92
efad53c4 93sub dict {
3e465d5d 94 require DX::Value::Dict;
efad53c4 95 DX::Value::Dict->new(
96 members => { @_ },
97 );
98}
99
100sub proposition {
101 my ($pred, @args) = @_;
3e465d5d 102 require DX::Proposition;
efad53c4 103 DX::Proposition->new(
104 predicate => $pred,
105 args => \@args,
106 );
107}
108
1e812b19 109{
3e465d5d 110 my $dp;
1e812b19 111
112 sub deparse {
3e465d5d 113 $dp ||= do {
1444edde 114 require DX::TraceFormatter;
115 DX::TraceFormatter->new;
3e465d5d 116 };
1e812b19 117 my ($thing) = @_;
c25fbf05 118 $dp->format($thing);
1e812b19 119 }
120}
121
9d759b64 1221;