examples/standalone/02_filter_data.cat
#!/usr/bin/env catnip
# Filtrage et transformation de données
# Usage: catnip filter_data.cat
struct User { id, name, age, active, score
is_active(self) => { self.active }
has_min_score(self, min_score) => { self.score >= min_score }
is_younger_than(self, max_age) => { self.age < max_age }
with_status(self, excellent_threshold) => {
status = if self.score >= excellent_threshold { 'excellent' } else { 'good' }
UserWithStatus(
id=self.id,
name=self.name,
age=self.age,
active=self.active,
score=self.score,
status=status,
)
}
}
struct UserWithStatus extends (User) { status }
# Données utilisateur
users = list(
User(id=1, name='Alice', age=28, active=True, score=85),
User(id=2, name='Bob', age=35, active=True, score=92),
User(id=3, name='Charlie', age=22, active=False, score=78),
User(id=4, name='Diana', age=29, active=True, score=88),
User(id=5, name='Eve', age=31, active=False, score=95),
)
# Fonction de filtrage générique
filter_users = (lst, predicate, idx, acc) => {
if idx >= len(lst) {
acc
} else {
user = lst[idx]
new_acc = if predicate(user) { acc + list(user) } else { acc }
filter_users(lst, predicate, idx + 1, new_acc)
}
}
# Fonction de mapping générique
map_users = (lst, transform, idx, acc) => {
if idx >= len(lst) {
acc
} else {
user = lst[idx]
new_acc = acc + list(transform(user))
map_users(lst, transform, idx + 1, new_acc)
}
}
is_active = (u) => { u.is_active() }
is_high_score = (u) => { u.has_min_score(85) }
is_young = (u) => { u.is_younger_than(30) }
add_status = (u) => { u.with_status(90) }
# Appliquer filtres
print("Filtrage de données")
print("")
print("Tous les utilisateurs : " + str(len(users)))
active_users = filter_users(users, is_active, 0, list())
print("Utilisateurs actifs : " + str(len(active_users)))
high_scorers = filter_users(users, is_high_score, 0, list())
print("Scores >= 85 : " + str(len(high_scorers)))
young_users = filter_users(users, is_young, 0, list())
print("Âge < 30 : " + str(len(young_users)))
print("")
print("Utilisateurs actifs avec high score :")
# Composition de filtres
active_and_high = filter_users(
active_users,
is_high_score,
0,
list(),
)
i = 0
while i < len(active_and_high) {
u = active_and_high[i]
print(" - " + u.name + " (score: " + str(u.score) + ")")
i = i + 1
}
print("")
print("Transformation avec status :")
# Mapper avec ajout de status
with_status = map_users(high_scorers, add_status, 0, list())
j = 0
while j < len(with_status) {
u = with_status[j]
print(" - " + u.name + " : " + u.status)
j = j + 1
}
# Retourner nombre de résultats finaux
len(active_and_high)