"""
GenomeList is a module that stores the multiple genes an Host may have.
TODO: Add support for adding the same gene twice (probably multisets)
"""
from __future__ import annotations
from copy import copy
from ...host import Host
from ...module import Module
from ...events import EventEmitter, EventLogger
from ..records.gene.gene import Gene
from ..all_events import InsertGeneEvent, RemoveGeneEvent, AlterGenePromoterEvent
[docs]class GenomeList ( Module ) :
genes: set[Gene]
[docs] def make ( self, genes: set[Gene] = set() ) -> None :
self.genes = genes
[docs] def copy ( self, ref:'GenomeList' ) -> None :
self.genes = ref.genes.copy()
[docs] def bind ( self, host:Host ) -> None :
host.observe( InsertGeneEvent, self.listen_insert_gene )
host.observe( RemoveGeneEvent, self.listen_remove_gene )
host.observe( AlterGenePromoterEvent, self.listen_alter_gene_promoter )
[docs] def sync ( self, emit:EventEmitter, log:EventLogger ) -> None :
pass # Nothing to sync.
[docs] def listen_insert_gene ( self, event:InsertGeneEvent, emit:EventEmitter, log:EventLogger ) -> None :
self.genes.add( event.gene )
log( "GenomeLibrary: added gene={}".format(event.gene.name) )
[docs] def listen_remove_gene ( self, event:RemoveGeneEvent, emit:EventEmitter, log:EventLogger ) -> None :
self.genes.remove( event.gene )
log( "GenomeLibrary: removed gene={}".format(event.gene.name) )
[docs] def get_genes_by_name ( self, name:str ) -> List[Gene] :
found_genes = [ gene for gene in self.locgenes if name == gene.name ]
return found_genes