Add string.foldl2.

Estimated hours taken: 0.1
Branches: main

library/string.m:
	Add string.foldl2.
This commit is contained in:
Zoltan Somogyi
2005-08-29 06:18:45 +00:00
parent 88b75863dc
commit db5c475ccc

View File

@@ -455,29 +455,46 @@
% strings into static data even when they might be updated.
%:- mode string__unsafe_set_char(in, in, di, uo) is det.
% string__foldl(Closure, String, Acc0, Acc):
% string__foldl(Closure, String, !Acc):
% `Closure' is an accumulator predicate which is to be called for each
% character of the string `String' in turn. The initial value of the
% accumulator is `Acc0' and the final value is `Acc'.
% accumulator is `!.Acc' and the final value is `!:Acc'.
% (string__foldl is equivalent to
% string__to_char_list(String, Chars),
% list__foldl(Closure, Chars, Acc0, Acc)
% list__foldl(Closure, Chars, !Acc)
% but is implemented more efficiently.)
%
:- func string__foldl(func(char, T) = T, string, T) = T.
:- pred string__foldl(pred(char, T, T), string, T, T).
:- mode string__foldl(pred(in, in, out) is det, in, in, out) is det.
:- func string__foldl(func(char, A) = A, string, A) = A.
:- pred string__foldl(pred(char, A, A), string, A, A).
:- mode string__foldl(pred(in, di, uo) is det, in, di, uo) is det.
:- mode string__foldl(pred(in, in, out) is det, in, in, out) is det.
:- mode string__foldl(pred(in, in, out) is semidet, in, in, out) is semidet.
:- mode string__foldl(pred(in, in, out) is nondet, in, in, out) is nondet.
:- mode string__foldl(pred(in, in, out) is multi, in, in, out) is multi.
% string__foldl2(Closure, String, !Acc1, !Acc2):
% A variant of string__foldl with two accumulators.
%
:- pred string__foldl2(pred(char, A, A, B, B), string, A, A, B, B).
:- mode string__foldl2(pred(in, di, uo, di, uo) is det,
in, di, uo, di, uo) is det.
:- mode string__foldl2(pred(in, in, out, di, uo) is det,
in, in, out, di, uo) is det.
:- mode string__foldl2(pred(in, in, out, in, out) is det,
in, in, out, in, out) is det.
:- mode string__foldl2(pred(in, in, out, in, out) is semidet,
in, in, out, in, out) is semidet.
:- mode string__foldl2(pred(in, in, out, in, out) is nondet,
in, in, out, in, out) is nondet.
:- mode string__foldl2(pred(in, in, out, in, out) is multi,
in, in, out, in, out) is multi.
% string__foldl_substring(Closure, String, Start, Count, !Acc)
% is equivalent to string__foldl(Closure, SubString, !Acc)
% where SubString = string__substring(String, Start, Count).
%
:- func string__foldl_substring(func(char, T) = T, string, int, int, T) = T.
:- pred string__foldl_substring(pred(char, T, T), string, int, int, T, T).
:- func string__foldl_substring(func(char, A) = A, string, int, int, A) = A.
:- pred string__foldl_substring(pred(char, A, A), string, int, int, A, A).
:- mode string__foldl_substring(pred(in, in, out) is det, in, in, in,
in, out) is det.
:- mode string__foldl_substring(pred(in, di, uo) is det, in, in, in,
@@ -489,6 +506,24 @@
:- mode string__foldl_substring(pred(in, in, out) is multi, in, in, in,
in, out) is multi.
% string__foldl_substring2(Closure, String, Start, Count, !Acc1, !Acc2)
% A variant of string__foldl_substring with two accumulators.
%
:- pred string__foldl2_substring(pred(char, A, A, B, B),
string, int, int, A, A, B, B).
:- mode string__foldl2_substring(pred(in, di, uo, di, uo) is det,
in, in, in, di, uo, di, uo) is det.
:- mode string__foldl2_substring(pred(in, in, out, di, uo) is det,
in, in, in, in, out, di, uo) is det.
:- mode string__foldl2_substring(pred(in, in, out, in, out) is det,
in, in, in, in, out, in, out) is det.
:- mode string__foldl2_substring(pred(in, in, out, in, out) is semidet,
in, in, in, in, out, in, out) is semidet.
:- mode string__foldl2_substring(pred(in, in, out, in, out) is nondet,
in, in, in, in, out, in, out) is nondet.
:- mode string__foldl2_substring(pred(in, in, out, in, out) is multi,
in, in, in, in, out, in, out) is multi.
% string__foldr(Closure, String, !Acc):
% As string__foldl/4, except that processing proceeds right-to-left.
%
@@ -819,20 +854,30 @@ string__set_char_det(Char, Int, String0, String) :-
error("string__set_char_det: index out of range")
).
string__foldl(Closure, String, Acc0, Acc) :-
string__foldl(Closure, String, !Acc) :-
string__length(String, Length),
string__foldl_substring(Closure, String, 0, Length, Acc0, Acc).
string__foldl_substring(Closure, String, 0, Length, !Acc).
string__foldl_substring(Closure, String, Start0, Count0, Acc0, Acc) :-
string__foldl2(Closure, String, !Acc1, !Acc2) :-
string__length(String, Length),
string__foldl2_substring(Closure, String, 0, Length, !Acc1, !Acc2).
string__foldl_substring(Closure, String, Start0, Count0, !Acc) :-
Start = max(0, Start0),
Count = min(Count0, length(String) - Start),
string__foldl_substring_2(Closure, String,Start, Count, Acc0, Acc).
string__foldl_substring_2(Closure, String, Start, Count, !Acc).
:- pred string__foldl_substring_2(pred(char, T, T), string, int, int, T, T).
:- mode string__foldl_substring_2(pred(in, in, out) is det, in, in, in,
in, out) is det.
string__foldl2_substring(Closure, String, Start0, Count0, !Acc1, !Acc2) :-
Start = max(0, Start0),
Count = min(Count0, length(String) - Start),
string__foldl2_substring_2(Closure, String, Start, Count,
!Acc1, !Acc2).
:- pred string__foldl_substring_2(pred(char, A, A), string, int, int, A, A).
:- mode string__foldl_substring_2(pred(in, di, uo) is det, in, in, in,
di, uo) is det.
:- mode string__foldl_substring_2(pred(in, in, out) is det, in, in, in,
in, out) is det.
:- mode string__foldl_substring_2(pred(in, in, out) is semidet, in, in, in,
in, out) is semidet.
:- mode string__foldl_substring_2(pred(in, in, out) is nondet, in, in, in,
@@ -849,6 +894,30 @@ string__foldl_substring_2(Closure, String, I, Count, !Acc) :-
true
).
:- pred string__foldl2_substring_2(pred(char, A, A, B, B), string, int, int,
A, A, B, B).
:- mode string__foldl2_substring_2(pred(in, di, uo, di, uo) is det,
in, in, in, di, uo, di, uo) is det.
:- mode string__foldl2_substring_2(pred(in, in, out, di, uo) is det,
in, in, in, in, out, di, uo) is det.
:- mode string__foldl2_substring_2(pred(in, in, out, in, out) is det,
in, in, in, in, out, in, out) is det.
:- mode string__foldl2_substring_2(pred(in, in, out, in, out) is semidet,
in, in, in, in, out, in, out) is semidet.
:- mode string__foldl2_substring_2(pred(in, in, out, in, out) is nondet,
in, in, in, in, out, in, out) is nondet.
:- mode string__foldl2_substring_2(pred(in, in, out, in, out) is multi,
in, in, in, in, out, in, out) is multi.
string__foldl2_substring_2(Closure, String, I, Count, !Acc1, !Acc2) :-
( 0 < Count ->
Closure(string__unsafe_index(String, I), !Acc1, !Acc2),
string__foldl2_substring_2(Closure, String, I + 1, Count - 1,
!Acc1, !Acc2)
;
true
).
string__foldr(F, String, Acc0) = Acc :-
Closure = ( pred(X::in, Y::in, Z::out) is det :- Z = F(X, Y)),
string__foldr(Closure, String, Acc0, Acc).
@@ -1242,8 +1311,8 @@ string__to_upper(StrIn, StrOut) :-
string__char_list_to_upper([], []).
string__char_list_to_upper([X | Xs], [Y | Ys]) :-
char__to_upper(X,Y),
string__char_list_to_upper(Xs,Ys).
char__to_upper(X, Y),
string__char_list_to_upper(Xs, Ys).
string__to_lower(StrIn, StrOut) :-
string__to_char_list(StrIn, List),
@@ -1254,8 +1323,8 @@ string__to_lower(StrIn, StrOut) :-
string__char_list_to_lower([], []).
string__char_list_to_lower([X | Xs], [Y | Ys]) :-
char__to_lower(X,Y),
string__char_list_to_lower(Xs,Ys).
char__to_lower(X, Y),
string__char_list_to_lower(Xs, Ys).
string__capitalize_first(S0, S) :-
( string__first_char(S0, C, S1) ->