Carp/core/Pattern.carp
2019-05-04 09:41:33 +02:00

117 lines
4.1 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

(system-include "carp_pattern.h")
(defmodule Pattern
(doc find "finds the index of a pattern in a string.
Returns `-1` if it doesnt find a matching pattern.")
(register find (Fn [&Pattern &String] Int))
(doc find-all "finds all indices of a pattern in a string.
Returns `[]` if it doesnt find a matching pattern.")
(register find-all (Fn [&Pattern &String] (Array Int)))
(doc match-groups "finds the match groups of the first match of a pattern in a string.
Returns `[]` if it doesnt find a matching pattern.")
(register match-groups (Fn [&Pattern &String] (Array String)))
(doc match-str "finds the first match of a pattern in a string.
Returns `[]` if it doesnt find a matching pattern.")
(register match-str (Fn [&Pattern &String] String))
(doc global-match "finds all matches of a pattern in a string as a nested array.
Returns `[]` if it doesnt find a matching pattern.")
(register global-match (Fn [&Pattern &String] (Array (Array String))))
(doc substitute "finds all matches of a pattern in a string and replaces it by another pattern `n` times.
If you want to replace all occurrences of the pattern, use `-1`.")
(register substitute (Fn [&Pattern &String &String Int] String))
(doc matches? "checks whether a pattern matches a string.")
(defn matches? [pat s] (/= (find pat s) -1))
(register str (Fn [&Pattern] String))
(register prn (Fn [&Pattern] String))
(register init (Fn [&String] Pattern))
(register = (Fn [&Pattern &Pattern] Bool))
(register delete (Fn [Pattern] ()))
(register copy (Fn [&Pattern] Pattern))
(doc from-chars "creates a pattern that matches a group of characters from a list of those characters.")
(defn from-chars [chars]
(Pattern.init &(str* @"[" (String.from-chars chars) @"]")))
)
(defmodule String
(doc in? "checks whether a string contains another string.")
(defn in? [s sub]
(Pattern.matches? &(Pattern.init sub) s))
(doc upper? "checks whether a string is all uppercase.")
(defn upper? [s]
(Pattern.matches? #"^[\u\s\p]*$" s))
(doc lower? "checks whether a string is all lowercase.")
(defn lower? [s]
(Pattern.matches? #"^[\l\s\p]*$" s))
(doc num? "checks whether a string is numerical.")
(defn num? [s]
(Pattern.matches? #"^[0-9]*$" s))
(doc alpha? "checks whether a string contains only alphabetical characters (a-Z).")
(defn alpha? [s]
(Pattern.matches? #"^[\u\l]*$" s))
(doc alphanum? "checks whether a string is alphanumerical.")
(defn alphanum? [s]
(Pattern.matches? #"^[\w]*$" s))
(doc hex? "checks whether a string is hexadecimal.")
(defn hex? [s]
(Pattern.matches? #"^[\x]*$" s))
(doc trim-left "trims whitespace from the left of a string.")
(defn trim-left [s]
(Pattern.substitute #"^\s+" s "" 1))
(doc trim-right "trims whitespace from the right of a string.")
(defn trim-right [s]
(Pattern.substitute #"\s+$" s "" 1))
(doc trim "trims whitespace from both sides of a string.")
(defn trim [s]
(trim-left &(trim-right s)))
(doc chomp "trims a newline from the end of a string.")
(defn chomp [s]
(Pattern.substitute #"\n$" s "" 1))
(doc collapse-whitespace "collapses groups of whitespace into single spaces.")
(defn collapse-whitespace [s]
(Pattern.substitute #"\s+" s " " -1))
(doc split-by "splits a string by separators.")
(defn split-by [s separators]
(let-do [pat (Pattern.from-chars separators)
idx (Pattern.find-all &pat s)
lidx (Array.length &idx)
result (Array.allocate (Int.inc lidx))]
(Array.aset-uninitialized! &result 0
(substring s 0 (if (> lidx 0) @(Array.nth &idx 0) (length s))))
(for [i 0 (Int.dec (Array.length &idx))]
(Array.aset-uninitialized! &result (Int.inc i)
(substring s (Int.inc @(Array.nth &idx i)) @(Array.nth &idx (Int.inc i)))))
(when (> lidx 0)
(Array.aset-uninitialized! &result lidx
(suffix-string s (Int.inc @(Array.nth &idx (Int.dec lidx))))))
result))
(doc words "splits a string into words.")
(defn words [s]
(split-by s &[\tab \space]))
(doc lines "splits a string into lines.")
(defn lines [s]
(split-by s &[\newline]))
)