--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/exps/Attic/Element.scala Mon Feb 11 23:18:05 2019 +0000
@@ -0,0 +1,89 @@
+import Element.elem
+abstract class Element{
+ def contents: Array[String]
+
+ def height: Int = contents.length
+ def width: Int = contents(0).length
+
+
+
+ def above(that: Element): Element = {
+ //new ArrayElement(this.contents ++ that.contents)
+ val this1 = this widen that.width
+ val that1 = that widen this.width
+ elem(this1.contents ++ that1.contents)
+ }
+ def left_align(that: Element): Element = {
+ if (this.width == that.width){
+ this above that
+ }
+ else if (this.width < that.width) {
+ (this beside elem(' ', that.width - this.width, this.height)) above that
+ }
+ else {
+ this above (that beside elem(' ', this.width - that.width, that.height))
+ }
+ }
+ def up_align(that: Element): Element = {
+ if (this.height == that.height){
+ this beside that
+ }
+ else if (this.height < that.height) {
+ (this above elem(' ', this.width, that.height - this.height)) beside that
+ }
+ else {
+ this beside (that above elem(' ', that.width, this.height - that.height))
+ }
+ }
+ def beside(that: Element): Element = {
+ val this1 = this heighten that.height
+ val that1 = that heighten this.height
+ elem(
+ for ((line1, line2) <- this1.contents zip that1.contents)
+ yield line1 + line2)
+ }
+ def widen(w: Int): Element =
+ if(w <= width) this
+ else {
+ val left = Element.elem(' ', (w - width) / 2, height)
+ var right = Element.elem(' ', w - width - left.width, height)
+ left beside this beside right
+ }
+ def heighten(h: Int): Element =
+ if (h <= height) this
+ else {
+ val top = Element.elem(' ', width, (h - height) / 2)
+ val bot = Element.elem(' ', width, h - height - top.height)
+ top above this above bot
+ }
+ override def toString = contents mkString "\n"
+}
+object Element {
+ private class ArrayElement(
+ val contents: Array[String]
+ ) extends Element
+
+ private class LineElement(s: String) extends Element {
+ val contents = Array(s)
+ override def width = s.length
+ override def height = 1
+ }
+
+ private class UniformElement(
+ ch: Char,
+ override val width: Int,
+ override val height: Int
+ ) extends Element {
+ private val line = ch.toString * width
+ def contents = Array.fill(height)(line)
+ }
+
+ def elem(contents: Array[String]): Element =
+ new ArrayElement(contents)
+
+ def elem(chr: Char, width: Int, height: Int): Element =
+ new UniformElement(chr, width, height)
+
+ def elem(line: String): Element =
+ new LineElement(line)
+}
\ No newline at end of file