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)