Δημιουργία ενός zipper για ένα δυαδικό δέντρο.
Τα Zippers είναι ένας καθαρά συναρτησιακός τρόπος να πλοηγείσαι μέσα σε μια δομή δεδομένων και να τη χειρίζεσαι. Περιέχουν ουσιαστικά μια δομή δεδομένων και έναν δείκτη μέσα σε αυτή τη δομή δεδομένων (που ονομάζεται εστίαση).
Για παράδειγμα, δεδομένου ενός rose tree (όπου κάθε κόμβος περιέχει μια τιμή και μια λίστα με παιδικούς κόμβους), ένα zipper μπορεί να υποστηρίζει τις εξής λειτουργίες:
from_tree (παίρνει ένα zipper από ένα rose tree, η εστίαση είναι στον κόμβο ρίζας)to_tree (παίρνει το rose tree από το zipper)value (παίρνει την τιμή του κόμβου εστίασης)prev (μετακινεί την εστίαση στο προηγούμενο παιδί του ίδιου γονέα,
επιστρέφει ένα νέο zipper)next (μετακινεί την εστίαση στο επόμενο παιδί του ίδιου γονέα, επιστρέφει ένα
νέο zipper)up (μετακινεί την εστίαση στον γονέα, επιστρέφει ένα νέο zipper)set_value (ορίζει την τιμή του κόμβου εστίασης, επιστρέφει ένα νέο zipper)insert_before (εισάγει ένα νέο υποδέντρο πριν από τον κόμβο εστίασης, αυτό
γίνεται το prev του κόμβου εστίασης, επιστρέφει ένα νέο zipper)insert_after (εισάγει ένα νέο υποδέντρο μετά από τον κόμβο εστίασης, αυτό γίνεται
το next του κόμβου εστίασης, επιστρέφει ένα νέο zipper)delete (αφαιρεί τον κόμβο εστίασης και όλα τα υποδέντρα, η εστίαση μετακινείται στον
κόμβο next αν είναι δυνατόν, αλλιώς στον κόμβο prev αν είναι δυνατόν,
αλλιώς στον γονικό κόμβο, επιστρέφει ένα νέο zipper)Το Zipper προσφέρει έναν συναρτησιακό τρόπο για να περιηγηθείς σε ένα δέντρο Node.
Όλες οι κλήσεις του Zipper πρέπει να επιστρέφουν ένα νέο αντικείμενο Zipper.
Αν το Zipper δεν αλλάζει τιμές (δηλαδή, αν δεν έχει κληθεί καμία μέθοδος Set*), το Zipper πρέπει να χρησιμοποιεί το ίδιο υποκείμενο δέντρο.
Όταν καλείται μια μέθοδος Set*, το νέο Zipper πρέπει να έχει ένα νέο δέντρο, αφήνοντας το αρχικό δέντρο αμετάβλητο.
Οι κλήσεις του Zipper που μετακινούν την εστίαση σε ένα μη έγκυρο Node πρέπει να επιστρέφουν ένα σφάλμα.
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Go με 35 έννοιες167 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.