Skip to content

Instantly share code, notes, and snippets.

@sullivan-
Created July 1, 2011 15:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sullivan-/1058724 to your computer and use it in GitHub Desktop.
Save sullivan-/1058724 to your computer and use it in GitHub Desktop.
trait Analysis {
val scoreColumns: Seq[ScoreColumn] = Seq()
}
trait AnalysisColumn
trait ScoreColumn extends AnalysisColumn
trait RawDataScoreColumn extends ScoreColumn
trait ComputedScoreColumn extends ScoreColumn {
val parentColumns: Seq[ScoreColumn] = Seq()
}
trait NonScoreColumn extends AnalysisColumn {
val visibleByDefault: Boolean = true
}
trait InfectionColumn extends NonScoreColumn
trait WellColumn extends NonScoreColumn
trait VirusColumn extends NonScoreColumn
sealed abstract class ColumnViewPolicy[A <: AnalysisColumn] {
val policyTitle: String
def isColumnVisible(analysis: Analysis, column: A): Boolean
}
abstract class LeafColumnViewPolicy[A <: AnalysisColumn] extends ColumnViewPolicy[A]
trait ShowAllColumnViewPolicy[A <: AnalysisColumn]
extends LeafColumnViewPolicy[A] {
override def isColumnVisible(analysis: Analysis, column: A) = true
}
trait HideAllColumnViewPolicy[A <: AnalysisColumn]
extends LeafColumnViewPolicy[A] {
override def isColumnVisible(analysis: Analysis, column: A) = false
}
abstract class ScoreColumnViewPolicy extends
LeafColumnViewPolicy[ScoreColumn]
case object ShowAllScoreColumnViewPolicy
extends ScoreColumnViewPolicy
with ShowAllColumnViewPolicy[ScoreColumn] {
override val policyTitle = "Show All Score Columns"
}
case object ShowRawColumnsOnlyViewPolicy extends ScoreColumnViewPolicy {
override val policyTitle = "Show Raw Columns Only"
override def isColumnVisible(analysis: Analysis, column: ScoreColumn) = column match {
case c: RawDataScoreColumn => true
case _ => false
}
}
case object ShowComputedColumnsOnlyViewPolicy extends ScoreColumnViewPolicy {
override val policyTitle = "Show Computed Columns Only"
override def isColumnVisible(analysis: Analysis, column: ScoreColumn) = column match {
case c: RawDataScoreColumn => false
case _ => true
}
}
case object HideComputedColumnsParentsViewPolicy extends ScoreColumnViewPolicy {
override val policyTitle = "Hide Parents of Computed Columns"
override def isColumnVisible(analysis: Analysis, column: ScoreColumn) =
analysis.scoreColumns.filter {
_ match {
case c: ComputedScoreColumn => c.parentColumns.contains(column)
case _ => false
}
}.isEmpty
}
abstract class NonScoreColumnViewPolicy[A <: NonScoreColumn]
extends LeafColumnViewPolicy[A]
trait ShowVisibleByDefaultNonScoreColumnViewPolicy[A <: NonScoreColumn]
extends NonScoreColumnViewPolicy[A] {
override def isColumnVisible(analysis: Analysis, column: A) = column.visibleByDefault
}
abstract class InfectionColumnViewPolicy
extends NonScoreColumnViewPolicy[InfectionColumn]
case object ShowAllInfectionColumnViewPolicy
extends InfectionColumnViewPolicy
with ShowAllColumnViewPolicy[InfectionColumn] {
override val policyTitle = "Show All Infection Columns"
}
case object ShowVisibleByDefaultInfectionColumnViewPolicy
extends InfectionColumnViewPolicy
with ShowVisibleByDefaultNonScoreColumnViewPolicy[InfectionColumn] {
override val policyTitle = "Show Batch Only"
}
case object HideAllInfectionColumnViewPolicy
extends InfectionColumnViewPolicy
with HideAllColumnViewPolicy[InfectionColumn] {
override val policyTitle = "Hide All Infection Columns"
}
abstract class WellColumnViewPolicy
extends NonScoreColumnViewPolicy[WellColumn]
case object ShowAllWellColumnViewPolicy
extends WellColumnViewPolicy with ShowAllColumnViewPolicy[WellColumn] {
override val policyTitle = "Show All Well Columns"
}
case object ShowVisibleByDefaultWellColumnViewPolicy
extends WellColumnViewPolicy
with ShowVisibleByDefaultNonScoreColumnViewPolicy[WellColumn] {
override val policyTitle = "Show Plate and Well Only"
}
case object HideAllWellColumnViewPolicy
extends WellColumnViewPolicy with HideAllColumnViewPolicy[WellColumn] {
override val policyTitle = "Hide All Well Columns"
}
abstract class VirusColumnViewPolicy
extends NonScoreColumnViewPolicy[VirusColumn]
case object ShowAllVirusColumnViewPolicy
extends VirusColumnViewPolicy with ShowAllColumnViewPolicy[VirusColumn] {
override val policyTitle = "Show All Virus Columns"
}
case object HideAllVirusColumnViewPolicy
extends VirusColumnViewPolicy with HideAllColumnViewPolicy[VirusColumn] {
override val policyTitle = "Hide All Virus Columns"
}
abstract class AnalysisColumnViewPolicy
extends ColumnViewPolicy[AnalysisColumn]
case class CompositeColumnViewPolicy(
scoreColumnViewPolicy: ScoreColumnViewPolicy,
infectionColumnViewPolicy: InfectionColumnViewPolicy,
wellColumnViewPolicy: WellColumnViewPolicy,
virusColumnViewPolicy: VirusColumnViewPolicy)
extends AnalysisColumnViewPolicy {
override val policyTitle = "Composite Column View Policy"
override def isColumnVisible(analysis: Analysis, column: AnalysisColumn): Boolean = {
column match {
case c: ScoreColumn => scoreColumnViewPolicy.isColumnVisible(analysis, c)
case c: InfectionColumn => infectionColumnViewPolicy.isColumnVisible(analysis, c)
case c: WellColumn => wellColumnViewPolicy.isColumnVisible(analysis, c)
case c: VirusColumn => virusColumnViewPolicy.isColumnVisible(analysis, c)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment