examples/run/02_filter_data.cat
#!/usr/bin/env catnip
# Filtrage et transformation de données

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) => {
    fold(lst, list(), (acc, user) => { if predicate(user) { acc + list(user) } else { acc } })
}

# Fonction de mapping générique
map_users = (lst, transform) => {
    fold(lst, list(), (acc, user) => { acc + list(transform(user)) })
}

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(f"Tous les utilisateurs : {len(users)}")

active_users = filter_users(users, is_active)
print(f"Utilisateurs actifs : {len(active_users)}")

high_scorers = filter_users(users, is_high_score)
print(f"Scores >= 85 : {len(high_scorers)}")

young_users = filter_users(users, is_young)
print(f"Âge < 30 : {len(young_users)}")

print()
print("Utilisateurs actifs avec high score :")

# Composition de filtres
active_and_high = filter_users(active_users, is_high_score)

for u in active_and_high {
    print(f"  - {u.name}  (score: {u.score})")
}

print()
print("Transformation avec status :")

# Mapper avec ajout de status
with_status = map_users(high_scorers, add_status)

for u in with_status {
    print(f"  - {u.name} : {u.status}")
}

# Retourner nombre de résultats finaux
len(active_and_high)  # → 3