+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Part 302 of 365

๐Ÿ“˜ Function Pipelining: Data Flow

Master function pipelining: data flow in Python with practical examples, best practices, and real-world applications ๐Ÿš€

๐Ÿ’ŽAdvanced
25 min read

Prerequisites

  • Basic understanding of programming concepts ๐Ÿ“
  • Python installation (3.8+) ๐Ÿ
  • VS Code or preferred IDE ๐Ÿ’ป

What you'll learn

  • Understand the concept fundamentals ๐ŸŽฏ
  • Apply the concept in real projects ๐Ÿ—๏ธ
  • Debug common issues ๐Ÿ›
  • Write clean, Pythonic code โœจ

๐ŸŽฏ Introduction

Welcome to this exciting tutorial on function pipelining and data flow! ๐ŸŽ‰ In this guide, weโ€™ll explore how to create elegant data transformation pipelines that make your code readable, maintainable, and absolutely beautiful.

Youโ€™ll discover how function pipelining can transform your Python development experience. Whether youโ€™re processing data ๐Ÿ“Š, building APIs ๐ŸŒ, or creating data analysis workflows ๐Ÿ“ˆ, understanding function pipelining is essential for writing clean, functional code.

By the end of this tutorial, youโ€™ll feel confident creating powerful data pipelines in your own projects! Letโ€™s dive in! ๐ŸŠโ€โ™‚๏ธ

๐Ÿ“š Understanding Function Pipelining

๐Ÿค” What is Function Pipelining?

Function pipelining is like an assembly line in a factory ๐Ÿญ. Think of it as connecting multiple functions together where the output of one function becomes the input of the next, creating a smooth flow of data transformation.

In Python terms, itโ€™s a functional programming technique that chains operations together in a clear, readable way. This means you can:

  • โœจ Transform data step-by-step
  • ๐Ÿš€ Create reusable transformation chains
  • ๐Ÿ›ก๏ธ Build maintainable data workflows

๐Ÿ’ก Why Use Function Pipelining?

Hereโ€™s why developers love function pipelining:

  1. Readability ๐Ÿ“–: Code reads like a story of data transformation
  2. Modularity ๐Ÿงฉ: Each function does one thing well
  3. Testability ๐Ÿงช: Test each transformation independently
  4. Reusability ๐Ÿ”„: Compose pipelines from existing functions

Real-world example: Imagine processing customer orders ๐Ÿ›’. With pipelining, you can validate โ†’ calculate tax โ†’ apply discount โ†’ format receipt in a clear, linear flow!

๐Ÿ”ง Basic Syntax and Usage

๐Ÿ“ Simple Example

Letโ€™s start with a friendly example:

# ๐Ÿ‘‹ Hello, Function Pipelining!
def add_five(x):
    """Add 5 to the input ๐ŸŽฏ"""
    return x + 5

def multiply_by_two(x):
    """Multiply by 2 โœจ"""
    return x * 2

def subtract_three(x):
    """Subtract 3 ๐Ÿ”ง"""
    return x - 3

# ๐ŸŽจ Traditional approach (nested calls)
result = subtract_three(multiply_by_two(add_five(10)))
print(f"Result: {result}")  # Result: 27

# ๐Ÿš€ Let's create a simple pipe function!
def pipe(*functions):
    """Create a pipeline from functions ๐Ÿ—๏ธ"""
    def pipeline(value):
        for func in functions:
            value = func(value)
        return value
    return pipeline

# โœจ Using our pipe function
transform = pipe(add_five, multiply_by_two, subtract_three)
result = transform(10)
print(f"Piped result: {result}")  # Piped result: 27

๐Ÿ’ก Explanation: Notice how the pipe function makes the data flow clear! We read left-to-right instead of inside-out.

๐ŸŽฏ Common Patterns

Here are patterns youโ€™ll use daily:

# ๐Ÿ—๏ธ Pattern 1: Data validation pipeline
def validate_not_empty(data):
    """Check data is not empty โœ…"""
    if not data:
        raise ValueError("Data cannot be empty! ๐Ÿ˜ฑ")
    return data

def validate_type(expected_type):
    """Check data type ๐Ÿ”"""
    def validator(data):
        if not isinstance(data, expected_type):
            raise TypeError(f"Expected {expected_type.__name__}, got {type(data).__name__} ๐Ÿ˜…")
        return data
    return validator

def validate_range(min_val, max_val):
    """Check numeric range ๐Ÿ“Š"""
    def validator(data):
        if not min_val <= data <= max_val:
            raise ValueError(f"Value must be between {min_val} and {max_val} ๐ŸŽฏ")
        return data
    return validator

# ๐ŸŽจ Create validation pipeline
validate_age = pipe(
    validate_not_empty,
    validate_type(int),
    validate_range(0, 150)
)

# ๐Ÿ”„ Pattern 2: Text processing pipeline
def strip_whitespace(text):
    """Remove extra spaces ๐Ÿงน"""
    return text.strip()

def to_lowercase(text):
    """Convert to lowercase ๐Ÿ”ก"""
    return text.lower()

def remove_punctuation(text):
    """Remove punctuation marks โœ‚๏ธ"""
    import string
    return text.translate(str.maketrans('', '', string.punctuation))

# ๐Ÿš€ Text cleaning pipeline
clean_text = pipe(
    strip_whitespace,
    to_lowercase,
    remove_punctuation
)

print(clean_text("  Hello, World!  "))  # hello world

๐Ÿ’ก Practical Examples

๐Ÿ›’ Example 1: E-commerce Order Processing

Letโ€™s build something real:

# ๐Ÿ›๏ธ Define our order processing pipeline
from dataclasses import dataclass
from typing import List
from datetime import datetime

@dataclass
class OrderItem:
    """Product in an order ๐Ÿ“ฆ"""
    name: str
    price: float
    quantity: int
    emoji: str  # Every product needs an emoji!

@dataclass
class Order:
    """Customer order ๐Ÿ›’"""
    items: List[OrderItem]
    customer_name: str
    created_at: datetime = None
    
    def __post_init__(self):
        if not self.created_at:
            self.created_at = datetime.now()

# ๐ŸŽฏ Pipeline functions
def calculate_subtotal(order):
    """Calculate order subtotal ๐Ÿ’ฐ"""
    order.subtotal = sum(
        item.price * item.quantity 
        for item in order.items
    )
    print(f"๐Ÿ“Š Subtotal: ${order.subtotal:.2f}")
    return order

def apply_tax(tax_rate=0.08):
    """Apply tax to order ๐Ÿฆ"""
    def add_tax(order):
        order.tax = order.subtotal * tax_rate
        order.total_with_tax = order.subtotal + order.tax
        print(f"๐Ÿ’ธ Tax ({tax_rate*100}%): ${order.tax:.2f}")
        return order
    return add_tax

def apply_discount(discount_percent=0):
    """Apply discount if applicable ๐ŸŽ"""
    def add_discount(order):
        if discount_percent > 0:
            order.discount = order.total_with_tax * discount_percent
            order.final_total = order.total_with_tax - order.discount
            print(f"๐ŸŽ‰ Discount ({discount_percent*100}%): -${order.discount:.2f}")
        else:
            order.final_total = order.total_with_tax
        return order
    return add_discount

def generate_receipt(order):
    """Generate order receipt ๐Ÿงพ"""
    print("\n" + "="*40)
    print(f"๐Ÿ›’ Order Receipt for {order.customer_name}")
    print("="*40)
    for item in order.items:
        print(f"{item.emoji} {item.name}: ${item.price:.2f} x {item.quantity}")
    print("-"*40)
    print(f"Subtotal: ${order.subtotal:.2f}")
    print(f"Tax: ${order.tax:.2f}")
    if hasattr(order, 'discount') and order.discount > 0:
        print(f"Discount: -${order.discount:.2f}")
    print(f"๐Ÿ’ณ Total: ${order.final_total:.2f}")
    print("="*40)
    return order

# ๐Ÿš€ Create order processing pipeline
process_order = pipe(
    calculate_subtotal,
    apply_tax(0.08),
    apply_discount(0.10),  # 10% discount
    generate_receipt
)

# ๐ŸŽฎ Let's use it!
order = Order(
    items=[
        OrderItem("Python Book", 29.99, 1, "๐Ÿ“˜"),
        OrderItem("Coffee Mug", 12.99, 2, "โ˜•"),
        OrderItem("Mechanical Keyboard", 89.99, 1, "โŒจ๏ธ")
    ],
    customer_name="Sarah Developer"
)

processed_order = process_order(order)

๐ŸŽฏ Try it yourself: Add shipping calculation and loyalty points to the pipeline!

๐ŸŽฎ Example 2: Game Analytics Pipeline

Letโ€™s make it fun:

# ๐Ÿ† Game analytics pipeline
from collections import defaultdict
import statistics

@dataclass
class GameEvent:
    """Game event data ๐ŸŽฎ"""
    player_id: str
    event_type: str  # "kill", "death", "assist", "objective"
    timestamp: float
    points: int
    emoji: str

class GameAnalytics:
    """Analytics pipeline for game data ๐Ÿ“Š"""
    
    def __init__(self):
        self.events = []
    
    def add_events(self, events):
        """Add events to analyze ๐Ÿ“ฅ"""
        self.events.extend(events)
        print(f"๐Ÿ“Š Added {len(events)} events!")
        return self
    
    def filter_by_type(self, event_type):
        """Filter events by type ๐Ÿ”"""
        self.events = [e for e in self.events if e.event_type == event_type]
        print(f"๐ŸŽฏ Filtered to {len(self.events)} {event_type} events")
        return self
    
    def group_by_player(self):
        """Group events by player ๐Ÿ‘ฅ"""
        self.player_groups = defaultdict(list)
        for event in self.events:
            self.player_groups[event.player_id].append(event)
        print(f"๐Ÿ‘ค Grouped into {len(self.player_groups)} players")
        return self
    
    def calculate_stats(self):
        """Calculate player statistics ๐Ÿงฎ"""
        self.player_stats = {}
        for player_id, events in self.player_groups.items():
            points = [e.points for e in events]
            self.player_stats[player_id] = {
                'total_points': sum(points),
                'avg_points': statistics.mean(points) if points else 0,
                'event_count': len(events),
                'emoji': events[0].emoji if events else "๐ŸŽฎ"
            }
        return self
    
    def generate_leaderboard(self):
        """Create leaderboard ๐Ÿ†"""
        sorted_players = sorted(
            self.player_stats.items(),
            key=lambda x: x[1]['total_points'],
            reverse=True
        )
        
        print("\n๐Ÿ† LEADERBOARD ๐Ÿ†")
        print("="*40)
        for rank, (player_id, stats) in enumerate(sorted_players[:5], 1):
            print(f"{rank}. {stats['emoji']} Player {player_id}: {stats['total_points']} points")
        return self

# ๐ŸŽจ Create analytics pipeline using method chaining
def analyze_game_session(events):
    """Analyze a game session ๐ŸŽฎ"""
    return (GameAnalytics()
        .add_events(events)
        .filter_by_type("kill")
        .group_by_player()
        .calculate_stats()
        .generate_leaderboard()
    )

# ๐Ÿš€ Test the pipeline
game_events = [
    GameEvent("Alice", "kill", 100.5, 100, "๐Ÿ”ฅ"),
    GameEvent("Bob", "kill", 101.2, 100, "โšก"),
    GameEvent("Alice", "kill", 102.1, 150, "๐Ÿ”ฅ"),
    GameEvent("Charlie", "kill", 103.0, 200, "๐Ÿ’ช"),
    GameEvent("Bob", "death", 104.5, -50, "โšก"),
    GameEvent("Alice", "kill", 105.2, 100, "๐Ÿ”ฅ"),
]

result = analyze_game_session(game_events)

๐Ÿš€ Advanced Concepts

๐Ÿง™โ€โ™‚๏ธ Advanced Topic 1: Async Pipelines

When youโ€™re ready to level up, try async pipelines:

# ๐ŸŽฏ Async pipeline for API data
import asyncio
from typing import Callable, Any

async def async_pipe(*functions):
    """Create async pipeline โšก"""
    async def pipeline(value):
        for func in functions:
            if asyncio.iscoroutinefunction(func):
                value = await func(value)
            else:
                value = func(value)
        return value
    return pipeline

# ๐Ÿช„ Example async transformations
async def fetch_user_data(user_id):
    """Simulate API call ๐ŸŒ"""
    print(f"๐Ÿ“ก Fetching user {user_id}...")
    await asyncio.sleep(0.5)  # Simulate network delay
    return {"id": user_id, "name": f"User{user_id}", "score": user_id * 100}

async def enrich_with_badges(user_data):
    """Add badges based on score ๐Ÿ…"""
    score = user_data["score"]
    if score >= 500:
        user_data["badge"] = "๐Ÿ† Champion"
    elif score >= 300:
        user_data["badge"] = "๐Ÿฅˆ Expert"
    else:
        user_data["badge"] = "๐Ÿฅ‰ Beginner"
    return user_data

def format_profile(user_data):
    """Format user profile ๐Ÿ“‹"""
    return f"{user_data['badge']} {user_data['name']} (Score: {user_data['score']})"

# ๐Ÿš€ Create async pipeline
process_user = asyncio.run(async_pipe(
    fetch_user_data,
    enrich_with_badges,
    format_profile
)(5))

print(process_user)

๐Ÿ—๏ธ Advanced Topic 2: Pipeline Operators

For the brave developers:

# ๐Ÿš€ Custom pipeline operators
class Pipeline:
    """Advanced pipeline with operators ๐Ÿ”ง"""
    
    def __init__(self, value):
        self.value = value
    
    def __rshift__(self, func):
        """Use >> operator for piping ๐ŸŽฏ"""
        return Pipeline(func(self.value))
    
    def __or__(self, func):
        """Use | operator for piping (Unix style) ๐Ÿง"""
        return Pipeline(func(self.value))
    
    def __repr__(self):
        return f"Pipeline({self.value})"

# ๐ŸŽจ Usage with operators
result = (
    Pipeline(10) 
    >> add_five 
    >> multiply_by_two 
    | subtract_three
).value

print(f"Operator pipeline result: {result}")  # 27

# ๐Ÿ’ซ Create a more complex example
def debug_print(label):
    """Debug helper ๐Ÿ›"""
    def printer(value):
        print(f"๐Ÿ” {label}: {value}")
        return value
    return printer

# ๐ŸŒŸ Complex transformation
result = (
    Pipeline("  Hello, World!  ")
    >> debug_print("Original")
    >> strip_whitespace
    >> debug_print("After strip")
    >> to_lowercase
    >> debug_print("After lowercase")
    >> remove_punctuation
    >> debug_print("Final")
).value

โš ๏ธ Common Pitfalls and Solutions

๐Ÿ˜ฑ Pitfall 1: Mutable State in Pipelines

# โŒ Wrong way - modifying shared state!
shared_list = []

def bad_append(value):
    shared_list.append(value)  # ๐Ÿ’ฅ Side effect!
    return value

# โœ… Correct way - pure functions!
def good_append(lst, value):
    """Return new list with appended value ๐Ÿ›ก๏ธ"""
    return lst + [value]

# Or use immutable transformations
from functools import reduce

def pipeline_append(values):
    """Build list through pipeline ๐Ÿ“ฆ"""
    return reduce(lambda acc, val: acc + [val], values, [])

๐Ÿคฏ Pitfall 2: Error Handling in Pipelines

# โŒ Dangerous - errors break the whole pipeline!
def risky_divide(x):
    return 10 / x  # ๐Ÿ’ฅ Zero division error!

# โœ… Safe - handle errors gracefully!
def safe_divide(divisor):
    """Safe division with error handling ๐Ÿ›ก๏ธ"""
    def divide(value):
        try:
            return value / divisor
        except ZeroDivisionError:
            print("โš ๏ธ Cannot divide by zero!")
            return float('inf')  # Or return a default
        except Exception as e:
            print(f"๐Ÿ˜… Unexpected error: {e}")
            return value
    return divide

# ๐ŸŽฏ Even better - Result type pattern
from typing import Union, Tuple

class Success:
    def __init__(self, value):
        self.value = value
        self.is_success = True

class Failure:
    def __init__(self, error):
        self.error = error
        self.is_success = False

def safe_pipe(*functions):
    """Pipeline with error handling ๐Ÿš€"""
    def pipeline(value):
        result = Success(value)
        for func in functions:
            if result.is_success:
                try:
                    result = Success(func(result.value))
                except Exception as e:
                    result = Failure(e)
                    print(f"โš ๏ธ Pipeline failed at {func.__name__}: {e}")
                    break
        return result
    return pipeline

๐Ÿ› ๏ธ Best Practices

  1. ๐ŸŽฏ Keep Functions Pure: No side effects, return new values
  2. ๐Ÿ“ Single Responsibility: Each function does one thing well
  3. ๐Ÿ›ก๏ธ Handle Errors: Donโ€™t let one error break everything
  4. ๐ŸŽจ Name Clearly: validate_email not ve
  5. โœจ Compose Reusable Parts: Build complex from simple

๐Ÿงช Hands-On Exercise

๐ŸŽฏ Challenge: Build a Data Processing Pipeline

Create a data processing pipeline for analyzing social media posts:

๐Ÿ“‹ Requirements:

  • โœ… Clean text (remove URLs, mentions, hashtags)
  • ๐Ÿท๏ธ Extract sentiment (positive, negative, neutral)
  • ๐Ÿ‘ค Count word frequency
  • ๐Ÿ“… Group by date
  • ๐ŸŽจ Generate summary statistics

๐Ÿš€ Bonus Points:

  • Add emoji sentiment analysis
  • Implement trending topic detection
  • Create visualization-ready output

๐Ÿ’ก Solution

๐Ÿ” Click to see solution
# ๐ŸŽฏ Social media analytics pipeline!
import re
from collections import Counter
from datetime import datetime
from dataclasses import dataclass
from typing import List, Dict

@dataclass
class Post:
    """Social media post ๐Ÿ“ฑ"""
    text: str
    timestamp: datetime
    author: str
    likes: int = 0

class TextProcessor:
    """Text processing utilities ๐Ÿ”ง"""
    
    @staticmethod
    def remove_urls(text):
        """Remove URLs ๐ŸŒ"""
        return re.sub(r'https?://\S+|www\.\S+', '', text)
    
    @staticmethod
    def remove_mentions(text):
        """Remove @mentions ๐Ÿ‘ค"""
        return re.sub(r'@\w+', '', text)
    
    @staticmethod
    def remove_hashtags(text):
        """Remove #hashtags ๐Ÿท๏ธ"""
        return re.sub(r'#\w+', '', text)
    
    @staticmethod
    def extract_emojis(text):
        """Extract emojis for sentiment ๐Ÿ˜Š"""
        emoji_pattern = re.compile(
            "["
            "\U0001F600-\U0001F64F"  # emoticons
            "\U0001F300-\U0001F5FF"  # symbols & pictographs
            "]+", 
            flags=re.UNICODE
        )
        return emoji_pattern.findall(text)

def clean_text(post):
    """Clean post text ๐Ÿงน"""
    post.cleaned_text = (
        post.text
        |> TextProcessor.remove_urls
        |> TextProcessor.remove_mentions
        |> TextProcessor.remove_hashtags
        |> str.strip
    )
    return post

def analyze_sentiment(post):
    """Simple sentiment analysis ๐Ÿ˜Š๐Ÿ˜ข๐Ÿ˜ก"""
    positive_words = {'good', 'great', 'awesome', 'love', 'excellent', 'happy'}
    negative_words = {'bad', 'terrible', 'hate', 'awful', 'sad', 'angry'}
    
    words = post.cleaned_text.lower().split()
    positive_score = sum(1 for word in words if word in positive_words)
    negative_score = sum(1 for word in words if word in negative_words)
    
    # Check emojis too!
    emojis = TextProcessor.extract_emojis(post.text)
    positive_emojis = ['๐Ÿ˜Š', '๐Ÿ˜„', 'โค๏ธ', '๐Ÿ‘', '๐ŸŽ‰']
    negative_emojis = ['๐Ÿ˜ข', '๐Ÿ˜ก', '๐Ÿ‘Ž', '๐Ÿ’”', '๐Ÿ˜ค']
    
    positive_score += sum(1 for emoji in emojis if emoji in positive_emojis)
    negative_score += sum(1 for emoji in emojis if emoji in negative_emojis)
    
    if positive_score > negative_score:
        post.sentiment = "positive ๐Ÿ˜Š"
    elif negative_score > positive_score:
        post.sentiment = "negative ๐Ÿ˜ข"
    else:
        post.sentiment = "neutral ๐Ÿ˜"
    
    return post

def count_words(post):
    """Count word frequency ๐Ÿ“Š"""
    words = post.cleaned_text.lower().split()
    post.word_counts = Counter(words)
    return post

def aggregate_stats(posts):
    """Generate summary statistics ๐Ÿ“ˆ"""
    stats = {
        'total_posts': len(posts),
        'sentiments': Counter(p.sentiment for p in posts),
        'top_words': Counter(),
        'posts_by_date': {},
        'average_likes': sum(p.likes for p in posts) / len(posts) if posts else 0
    }
    
    # Aggregate word counts
    for post in posts:
        stats['top_words'].update(post.word_counts)
    
    # Group by date
    for post in posts:
        date_key = post.timestamp.date()
        if date_key not in stats['posts_by_date']:
            stats['posts_by_date'][date_key] = []
        stats['posts_by_date'][date_key].append(post)
    
    return stats

def display_analytics(stats):
    """Display analytics beautifully ๐ŸŽจ"""
    print("\n๐Ÿ“Š SOCIAL MEDIA ANALYTICS REPORT")
    print("="*50)
    print(f"๐Ÿ“ฑ Total Posts: {stats['total_posts']}")
    print(f"โค๏ธ Average Likes: {stats['average_likes']:.1f}")
    
    print("\n๐Ÿ˜Š Sentiment Analysis:")
    for sentiment, count in stats['sentiments'].items():
        percentage = (count / stats['total_posts']) * 100
        print(f"  {sentiment}: {count} ({percentage:.1f}%)")
    
    print("\n๐Ÿ”ค Top 10 Words:")
    for word, count in stats['top_words'].most_common(10):
        print(f"  {word}: {count}")
    
    print("\n๐Ÿ“… Posts by Date:")
    for date, posts in sorted(stats['posts_by_date'].items()):
        print(f"  {date}: {len(posts)} posts")
    
    return stats

# ๐Ÿš€ Create the complete pipeline
analyze_social_media = pipe(
    lambda posts: [clean_text(p) for p in posts],
    lambda posts: [analyze_sentiment(p) for p in posts],
    lambda posts: [count_words(p) for p in posts],
    aggregate_stats,
    display_analytics
)

# ๐ŸŽฎ Test it out!
sample_posts = [
    Post("Just learned about Python pipelines! ๐Ÿš€ #coding @pythonista", 
         datetime(2024, 1, 15), "Alice", 42),
    Post("This tutorial is awesome! Love the emojis ๐Ÿ˜Š https://example.com", 
         datetime(2024, 1, 15), "Bob", 38),
    Post("Having a bad day... hate debugging ๐Ÿ˜ข #programmer", 
         datetime(2024, 1, 16), "Charlie", 5),
    Post("Great explanation! Really helpful ๐Ÿ‘", 
         datetime(2024, 1, 16), "Alice", 67),
]

results = analyze_social_media(sample_posts)

๐ŸŽ“ Key Takeaways

Youโ€™ve learned so much! Hereโ€™s what you can now do:

  • โœ… Create function pipelines with confidence ๐Ÿ’ช
  • โœ… Chain operations elegantly and readably ๐Ÿ”—
  • โœ… Build data processing workflows like a pro ๐ŸŽฏ
  • โœ… Handle errors gracefully in pipelines ๐Ÿ›ก๏ธ
  • โœ… Apply functional programming patterns in Python! ๐Ÿš€

Remember: Function pipelining makes your code flow like a beautiful river of data transformations! ๐ŸŒŠ

๐Ÿค Next Steps

Congratulations! ๐ŸŽ‰ Youโ€™ve mastered function pipelining and data flow!

Hereโ€™s what to do next:

  1. ๐Ÿ’ป Practice with the exercises above
  2. ๐Ÿ—๏ธ Build a data processing pipeline for your own project
  3. ๐Ÿ“š Explore libraries like toolz or pipe for advanced pipelining
  4. ๐ŸŒŸ Share your pipeline creations with the community!

Remember: Every data scientist and functional programmer started where you are. Keep piping, keep flowing, and most importantly, have fun! ๐Ÿš€


Happy coding! ๐ŸŽ‰๐Ÿš€โœจ