module stratego/gpp/Util
strategies
gpp-topdown-fputs(|stream) =
where(Stream(pointer) := stream)
; topdown(
try(
is-string
; where(gpp-fputs(|pointer))
)
)
/**
* Writes a String to a Stream
*
* @type (String, Stream) -> Stream
*/
gpp-fputs(|stream) =
?str; prim("SSL_fputs", str, stream)
strategies
/**
* Try to flatten lists but do not change to total number of
* elements. This means that empty lists (containg for a single
* element) are not removed.
*/
gpp-flat-list =
gpp-flat-list(![])
gpp-flat-list(cont) =
?[]; cont
gpp-flat-list(cont) =
?[hd | tl]
; if !hd => [] then
![[] | <gpp-flat-list(cont)> tl]
else
if !hd => [_ | _] then
<gpp-flat-list(<gpp-flat-list(cont)> tl)> hd
else
![hd | <gpp-flat-list(cont)> tl]
end
end
strategies
/**
* @type List(S-Option) -> Int
*/
gpp-hs-length = gpp-SOpt-value(|HS()) <+ !1
gpp-vs-length = gpp-SOpt-value(|VS()) <+ !0
gpp-is-length = gpp-SOpt-value(|IS()) <+ !0
gpp-SOpt-value(|opt) =
fetch(?SOpt(opt, value))
; <string-to-int> value
gpp-SOpts-of-alignment : AL(sopts) -> sopts
gpp-SOpts-of-alignment : AR(sopts) -> sopts
gpp-SOpts-of-alignment : AC(sopts) -> sopts
// Make sure that every element in the list occurs within a R box
// For instance:
// [R([],[1,2,3]), a,b,c, R([],[4,5,6])]
// is tranformed to
// [R([],[1,2,3]), R([],[a,b,c]), R([],[4,5,6])]
gpp-construct-rows =
split(id, ![]);
rec x ({a,b,xs,ys:
?([],xs);![R([],<reverse>xs)]
<+
?([R(a,b)|xs], ys);
![R([],<reverse>ys), R(a,b)|<x>(xs, [] )]
<+
?( [a|xs],ys);
<x>( xs, [a|ys])
});
filter( not( R(id,[]) ) )
/**
* Calculate relative string length. That is, by taking new lines and
* current horizontal position into account
*
* <string-length'(x)>"my_string" => 9
* <string-length'(x)>"my\nstring" => 6 - x
*/
gpp-rel-string-length(|xpos) =
explode-string => chars
; if at-suffix(?['\n' | tail]) then
<subt> (<length> tail, xpos)
else
<length> chars
end