view code/tree.lm @ 85:f420fabd0e44 default tip

One last README change
author Michael Pavone <pavone@retrodev.com>
date Mon, 28 Jul 2014 04:42:24 -0700
parents e1047192610c
children
line wrap: on
line source

#{
	makeTree:size <- :lst :size {
		ret <- 0
		sub <- 0
		half <- size / 2
		if: size = 2 {
			ret <- #[(lst value) ((lst tail) value)]
		} else: {
			if: size = 1 {
				ret <- lst
			} else: {
				sub <- split: lst at: half
				ret <- #[
					(makeTree: (sub value) size: half)
					(makeTree: (sub tail) size: size-half)
				]
			}
		}
		ret
	}
	
	makeTree <- :lst {
		size <- lst length
		#[size (makeTree: lst size: size)]
	}
	
	_filledTree <- :val size {
		ret <- 0
		half <- size / 2
		if: size > 2 {
			ret <- #[
				(_filledTree: val half)
				(_filledTree: val size-half)
			]
		} else: {
			ret <- #[val val]
		}
		ret
	}
	
	filledTree <- :val size {
		#[size (_filledTree: val size)]
	}
	
	get:fromTree:size <- :idx :tree :size {
		ret <- 0
		half <- size / 2
		if: size <= 2 {
			if: idx = 0 {
				ret <- tree value
			} else: {	
				ret <- tree tail
			}
		} else: {
			if: idx < half {
				ret <- get: idx fromTree: (tree value) size: half
			} else: {
				ret <- get: idx-half fromTree: (tree tail) size: size-half
			}
		}
		ret
	}
	
	get:fromTree <- :idx :tree {
		size <- tree value
		get: idx fromTree: (tree tail) size: size
	}
	
	treeMap:size <- :tree fun :size {
		ret <- 0
		half <- size / 2
		if: size = 2 {
			ret <- #[(fun: (tree value)) (fun: (tree tail))]
		} else: {
			if: size = 1 {
				ret <- #[(fun: (tree value)) 0]
			} else: {
				ret <- #[
					(treeMap: (tree value) fun size: half)
					(treeMap: (tree tail) fun size: size-half)
				]
			}
		}
		ret
	}
	
	treeMap <- :tree fun {	
		#[(tree value) (treeMap: (tree tail) fun size: (tree value))]
	}
	
	tree:size:update:with <- :tree :size :idx :fun {
		ret <- 0
		half <- size / 2
		if: size = 2 {
			if: idx = 0 {
				ret <- #[(fun: (tree value)) (tree tail)]
			} else: {
				ret <- #[(tree value) (fun: (tree tail))]
			}
		} else: {
			if: size = 1 {
				ret <- #[(fun: (tree value)) 0]
			} else: {
				if: (idx < half) {
					ret <- #[
						(tree: (tree value) size: half update: idx with: fun)
						(tree tail)
					]
				} else: {
					ret <- #[
						(tree value)
						(tree: (tree tail) size: size-half update: idx-half with: fun)
					]
				}
			}
		}
		ret
	}
	
	tree:update:with <- :tree :idx :fun {
		#[(tree value) (tree: (tree tail) size: (tree value) update: idx with: fun)]
	}
	
	tree:set:to <- :tree :idx :val {
		tree: tree update: idx with: :el { val }
	}
}