Summary Files Commits Branches @commit @diff @stats
path: root / src / StringConsumer / IWordsConsumer.cl
diff options
context:
space:
mode:
Commit6a3e6aa5cc863f43c49e95d336b99dcf6713a640 (patch)
Author
 Syndamia <kamen@syndamia.com>
2025-11-01 16:48:01 +0200
Committer
 Syndamia <kamen@syndamia.com>
2025-11-01 16:48:01 +0200
Files4cbdfe9fe92f233499da8948f9db6d0a2a40d2be /src/StringConsumer/IWordsConsumer.cl
cool-self-hosted-6a3e6aa5cc863f43c49e95d336b99dcf6713a640.tar
cool-self-hosted-6a3e6aa5cc863f43c49e95d336b99dcf6713a640.tar.gz
cool-self-hosted-6a3e6aa5cc863f43c49e95d336b99dcf6713a640.zip
Parentac5b073138ed3cd8073eed8eea053a1f4799fc25 (diff)
feat(StringConsumer)!: Rename IWordConsumer to IWordsConsumer
1 files changed, 63 insertions, 0 deletions
-rw-r--r--src/StringConsumer/IWordsConsumer.cl63
diff --git a/src/StringConsumer/IWordsConsumer.cl b/src/StringConsumer/IWordsConsumer.cl
new file mode 100644
index 0000000..ac782b4
--- /dev/null
+++ b/src/StringConsumer/IWordsConsumer.cl
@@ -0,0 +1,63 @@
+class WordList inherits System {
+ word: String;
+ next: WordList;
+
+ init(value: String, tail: Object) : WordList {{
+ assert(not (isvoid value), "init", "value argument cannot be void!");
+ assert(isvoid word, "init", "List has already been initialised!");
+
+ word <- value;
+ if isvoid tail then
+ void
+ else
+ case tail of
+ wl: WordList => next <- wl;
+ o: Object => assert(false, "init", "tail argument can be either a ConsumerList or void!");
+ esac
+ fi;
+
+ self;
+ }};
+
+ push(value: String) : WordList {{
+ assert(not (isvoid value), "push", "value argument cannot be void!");
+
+ if isvoid word
+ then
+ word <- value
+ else if isvoid next
+ then
+ next <- (new WordList).init(value, void)
+ else
+ next.push(value)
+ fi
+ fi;
+ self;
+ }};
+
+ any_starts(s: String, start: Int) : Bool {
+ if isvoid word
+ then false
+ else if s.substr(start, word.length()) = word
+ then true
+ else if isvoid next
+ then false
+ else next.any_starts(s, start)
+ fi
+ fi
+ fi
+ };
+};
+
+class IWordsConsumer inherits IStringConsumer {
+ matched_words: WordList <- new WordList;
+
+ consume(s: String) : Int {{
+ consumed_length <- 0;
+ while matched_words.any_starts(s, consumed_length)
+ loop
+ consumed_length <- consumed_length + 1
+ pool;
+ consumed_length;
+ }};
+};