View difference between Paste ID: QSSWui3D and JJUG1VDW
SHOW: | | - or go back to the newest paste.
1
    abstract class CacheBase() {
2
        def apply(key: Int): Float
3
    }
4
5
6
   case class CacheLeaf(key: Int, f: Int => Float) extends CacheBase {
7
        lazy val value = f(key)
8
        def apply(key: Int) = value
9
    }
10
11
    object CacheNode {
12
        def apply(size: Int, f: Int => Float): CacheNode = {
13
14
            def level(size: Int, mask: Int = 1): Int = size match {
15
                case 1 | 0 => mask
16
                case _     => level(size >> 1, mask << 1)
17
            }
18
19
            CacheNode(level(size), 0, f)
20
        }
21
    }
22
23
    case class CacheNode(level: Int, key: Int, f: Int => Float) extends CacheBase {
24
        lazy val left = if (level == 0) {
25
            CacheLeaf(key, f)
26
        } else {
27
            CacheNode(level >> 1, key | level, f)
28
        }
29
30
        lazy val right = if (level == 0) {
31
            CacheLeaf(key, f)
32
        } else {
33
            CacheNode(level >> 1, key, f)
34
        }
35
36
        def apply(key: Int) = if ((key & level) > 0) {
37
            left(key)
38
        } else {
39
            right(key)
40
        }
41
    }