Long before the seven kingdoms were created, there was a pen – a pen that can write stories into realities. In the vast universe, there is only one pen of this kind.
final class StoryPen : CustomStringConvertible {
static let sharedInstance = StoryPen ()
private var storyBook :[ String ] = []
var description : String { return "The Story Pen" }
private init (){
StoryTeller . sharedInstance . tell ( "The Story Pen came to exist" )
}
func addAStory ( story : String ){
storyBook . append ( story )
}
func showStoryBook (){
storyBook . map { StoryTeller . sharedInstance . tell ( $ 0 )}
}
}
final class StoryTeller {
static let sharedInstance = StoryTeller ( name : "August" )
var name : String
private init ( name : String ){
self . name = name
print ( "The Story Teller \(name)is born and he tells stories to the world. Here it goes..." )
}
func tell ( story : String ){
print ( story )
}
}
enum StoryType {
case Love
case Peace
case Log
}
func storify ( storyType : StoryType = . Log , subject : CustomStringConvertible , content : String ){
switch storyType {
case . Log : StoryPen . sharedInstance . addAStory ( "\(subject.description) // \(content)" )
case . Peace : StoryPen . sharedInstance . addAStory ( "A Story about Peace and \(subject.description)// \(content)" )
case . Love : StoryPen . sharedInstance . addAStory ( "A Story about Love and \(subject.description)// \(content)" )
}
}
protocol Kindom : CustomStringConvertible {
var name : String { get }
}
final class KindomOfDemon : Kindom {
static let sharedInstance = KindomOfDemon ( name : "The Kindom of Demon" )
var name : String
var description : String { return self . name }
private init ( name : String ){
self . name = name
storify ( subject : self , content : " created" )
}
}
final class KindomOfGod : Kindom {
static let sharedInstance = KindomOfDemon ( name : "The Kindom of God" )
var name : String
var description : String { return self . name }
private init ( name : String ){
self . name = name
storify ( subject : self , content : "created" )
}
}
final class KindomOfFairy : Kindom {
static let sharedInstance = KindomOfFairy ( name : "The Kindom of Fairy" )
var name : String
var description : String { return self . name }
private init ( name : String ){
self . name = name
storify ( subject : self , content : "created" )
}
}
final class KindomOfHell : Kindom {
static let sharedInstance = KindomOfHell ( name : "The Kindom of Hell" )
var name : String
var description : String { return self . name }
private init ( name : String ){
self . name = name
storify ( subject : self , content : "created" )
}
}
final class KindomOfMonster : Kindom {
static let sharedInstance = KindomOfMonster ( name : "The Kindom of Monster" )
var name : String
var description : String { return self . name }
private init ( name : String ){
self . name = name
storify ( subject : self , content : "created" )
}
}
final class KindomOfHuman : Kindom {
static let sharedInstance = KindomOfHuman ( name : "The Kindom of Human" )
var name : String
var description : String { return self . name }
private init ( name : String ){
self . name = name
storify ( subject : self , content : "created" )
}
}
//: Testing
KindomOfGod . sharedInstance
KindomOfFairy . sharedInstance
KindomOfMonster . sharedInstance
KindomOfHell . sharedInstance
KindomOfDemon . sharedInstance
KindomOfHuman . sharedInstance
StoryPen . sharedInstance . showStoryBook ()