Possibility to repeat string.
[svjatoslav_commons.git] / src / main / java / eu / svjatoslav / commons / string / String2.java
1 /*
2  * Svjatoslav Commons - shared library of common functionality. Author: Svjatoslav Agejenko.
3  * This project is released under Creative Commons Zero (CC0) license.
4  */
5 package eu.svjatoslav.commons.string;
6
7 import java.util.ArrayList;
8 import java.util.List;
9
10 public class String2 {
11
12     private final List<Character> chars = new ArrayList<>();
13
14     public String2(String value) {
15         addSuffix(value);
16     }
17
18     public String2 repeat(int count){
19         String value = toString();
20
21         for (int i = 1; i < count; i++) {
22             addSuffix(value);
23         }
24         return this;
25     }
26
27     public String2 addPrefix(final String prefix) {
28         if (prefix == null)
29             return this;
30
31         int i = 0;
32         for (final char c : prefix.toCharArray())
33             chars.add(i++, c);
34
35         return this;
36     }
37
38     public String2 addSuffix(final String suffix) {
39         if (suffix == null)
40             return this;
41
42         for (final char c : suffix.toCharArray())
43             chars.add(c);
44
45         return this;
46     }
47
48     public String2 addSuffix(String separator, final String suffix) {
49         if (!isEmpty())
50             addSuffix(separator);
51
52         addSuffix(suffix);
53
54         return this;
55     }
56
57     /**
58      * Cut given amount of characters from the left of the string.
59      *
60      * @param cutAmount of characters to cut
61      * @return part that was cut.
62      */
63     public String2 trimPrefix(final int cutAmount) {
64
65         int actualCutAmount = cutAmount;
66
67         if (actualCutAmount > getLength())
68             actualCutAmount = getLength();
69
70         chars.subList(0, actualCutAmount).clear();
71
72         return this;
73     }
74
75     public String2 trimPrefixIfExists(String prefix) {
76         if (prefix == null)
77             return this;
78
79         if (hasPrefix(prefix))
80             trimPrefix(prefix.length());
81
82         return this;
83     }
84
85     public String2 trimSuffixIfExists(String suffix) {
86         if (hasSuffix(suffix))
87             trimSuffix(suffix.length());
88
89         return this;
90     }
91
92     public String2 trimSuffix(int charsToTrim) {
93
94         if (charsToTrim > chars.size()) {
95             chars.clear();
96             return this;
97         }
98
99         for (int i = 0; i < charsToTrim; i++)
100             chars.remove(chars.size() - 1);
101
102         return this;
103     }
104
105     public boolean hasSuffix(String suffix) {
106         return contains(suffix, getLength() - suffix.length());
107     }
108
109     public boolean hasPrefix(String prefix) {
110         return contains(prefix, 0);
111     }
112
113     public boolean contains(String fragment, int index) {
114         if (index + fragment.length() > chars.size())
115             return false;
116
117         for (int i = 0; i < fragment.length(); i++)
118             if (chars.get(index + i) != fragment.charAt(i))
119                 return false;
120
121         return true;
122     }
123
124     public String2 enforceLength(final int targetLength) {
125         if (getLength() > targetLength)
126             chars.subList(targetLength, getLength()).clear();
127         else if (getLength() < targetLength) {
128             final int charactersToAdd = targetLength - getLength();
129             for (int i = 0; i < charactersToAdd; i++)
130                 chars.add(' ');
131         }
132
133         return this;
134     }
135
136     public int getLength() {
137         return chars.size();
138     }
139
140     public String getSubString(final int startInclusive, final int endExclusive) {
141         final char[] charArray = new char[endExclusive - startInclusive];
142
143         int j = 0;
144         for (int i = startInclusive; i < endExclusive; i++) {
145             charArray[j] = chars.get(i);
146             j++;
147         }
148         return new String(charArray);
149     }
150
151     public boolean isEmpty() {
152         return chars.size() == 0;
153     }
154
155     @Override
156     public String toString() {
157         return getSubString(0, chars.size());
158     }
159 }