diff options
| author | Calvin Morrison <mutantturkey@gmail.com> | 2013-11-13 13:07:23 -0500 | 
|---|---|---|
| committer | Calvin Morrison <mutantturkey@gmail.com> | 2013-11-13 13:07:23 -0500 | 
| commit | 9066ea884129957fe899d6d10cba1e17547214b9 (patch) | |
| tree | aaa3ba9e0e507d9d13d8258def7585675e86f221 /src/nbc/tree.sml | |
| parent | ba07cda9cbf54d33b657d9ee30bc03c0b67f0b5f (diff) | |
remove nbc:
Diffstat (limited to 'src/nbc/tree.sml')
| -rw-r--r-- | src/nbc/tree.sml | 225 | 
1 files changed, 0 insertions, 225 deletions
| diff --git a/src/nbc/tree.sml b/src/nbc/tree.sml deleted file mode 100644 index 5d64f51..0000000 --- a/src/nbc/tree.sml +++ /dev/null @@ -1,225 +0,0 @@ -functor Tree (Key: sig -	type key -	val compare: key * key -> order -end) :> sig -	type key = Key.key -	type 'datum tree -	val size: 'datum tree -> int -	val empty: 'datum tree -	val single: key * 'datum -> 'datum tree -	val add: 'datum tree * key * 'datum -> 'datum tree -	val find: 'datum tree * key -> 'datum option -	val exists: 'datum tree * key -> bool -	val up: 'datum tree -> (key * 'datum) Stream.stream -	val down: 'datum tree -> (key * 'datum) Stream.stream -	val upFrom: 'datum tree * key -> (key * 'datum) Stream.stream -	val downFrom: 'datum tree * key -> (key * 'datum) Stream.stream -	val fromList: (key * 'datum) list -> 'datum tree -	val fromStream: (key * 'datum) Stream.stream -> 'datum tree -	(* -	val remove: 'datum tree * key -> 'datum tree -	*) -end = struct -	type key = Key.key -	structure Height = Int8 -	datatype 'datum tree = -		Leaf -		| Branch of { -			height: Height.int -			, less: 'datum tree -			, key: key -			, datum: 'datum -			, greater: 'datum tree -		} -	fun size tree = case tree of -		Leaf => 0 -		| Branch {less, greater, ...} => -			1 + size less + size greater -	val empty = Leaf -	fun single (key, datum) = Branch { -		height = 1 -		, less = Leaf -		, key = key -		, datum = datum -		, greater = Leaf -	} -	fun height tree = case tree of -		Leaf => 0 -		| Branch {height, ...} => height -	fun calculateHeight {key, datum, less, greater} = Branch { -		key = key -		, datum = datum -		, less = less -		, greater = greater -		, height = 1 + Height.max (height less, height greater) -	} -	fun rotateLess branch = case branch of -	(* -		   b          d -		 a   d  =>  b   e -		    c e    a c -	*) -		{ -			less = a -			, key = bKey -			, datum = bDatum -			, greater = Branch { -				less = c -				, key = dKey -				, datum = dDatum -				, greater = e -				, height = _ -			} -		} => calculateHeight { -			less = calculateHeight { -				less = a -				, key = bKey -				, datum = bDatum -				, greater = c -			}, key = dKey -			, datum = dDatum -			, greater = e -		} | _ => raise Fail "rotateLess" -	fun rotateGreater branch = case branch of -	(* -		   d        b -		 b   e => a   d -		a c          c e -	*) -		{ -			less = Branch { -				less = a -				, key = bKey -				, datum = bDatum -				, greater = c -				, height = _ -			}, key = dKey -			, datum = dDatum -			, greater = e -		} => calculateHeight { -			less = a -			, key = bKey -			, datum = bDatum -			, greater = calculateHeight { -				less = c -				, key = dKey -				, datum = dDatum -				, greater = e -			} -		} | _ => raise Fail "rotateGreater" -	fun balance (branch as {key, datum, less, greater}) = -		let -			val heightLess = height less -			val heightGreater = height greater -		in -			if heightLess < heightGreater - 2 then -				rotateLess branch -			else if heightLess > heightGreater + 2 then -				rotateGreater branch -			else calculateHeight branch -		end -	fun add (tree, newKey, newDatum) = case tree of -		Leaf => single (newKey, newDatum) -		| Branch {height, less, key, datum, greater} => -			case Key.compare (newKey, key) of -				EQUAL => Branch { -					height = height -					, less = less -					, key = newKey -					, datum = newDatum -					, greater = greater -				} | LESS => balance { -					less = add (less, newKey, newDatum) -					, key = key -					, datum = datum -					, greater = greater -				} | GREATER => balance { -					less = less -					, key = key -					, datum = datum -					, greater = add (greater, newKey, newDatum) -				} -	fun find (tree, desiredKey) = case tree of -		Leaf => NONE -		| Branch {less, key, datum, greater, ...} => -			case Key.compare (desiredKey, key) of -				EQUAL => SOME datum -				| LESS => find (less, desiredKey) -				| GREATER => find (greater, desiredKey) -	fun exists (tree, desiredKey) = case find (tree, desiredKey) of -		NONE => false -		| SOME _ => true -	fun up tree = Stream.create (fn () => -		case tree of -			Leaf => NONE -			| Branch {less, key, datum, greater, ...} => -				Stream.getItem ( -					Stream.append ( -						up less -						, Stream.cons ( -							(key, datum) -							, up greater -						) -					) -				) -	) -	fun down tree = Stream.create (fn () => -		case tree of -			Leaf => NONE -			| Branch {greater, key, datum, less, ...} => -				Stream.getItem ( -					Stream.append ( -						down greater -						, Stream.cons ( -							(key, datum) -							, down less -						) -					) -				) -	) -	fun upFrom (tree, firstKey) = Stream.create (fn () => -		case tree of -			Leaf => NONE -			| Branch {less, key, datum, greater, ...} => -				case Key.compare (firstKey, key) of -					LESS => Stream.getItem ( -						Stream.append ( -							upFrom (less, firstKey) -							, Stream.cons ( -								(key, datum) -								, up greater -							) -						) -					) | EQUAL => SOME ( -						(key, datum) -						, up greater -					) | GREATER => Stream.getItem ( -						upFrom (greater, firstKey) -					) -	) -	fun downFrom (tree, firstKey) = Stream.create (fn () => -		case tree of -			Leaf => NONE -			| Branch {greater, key, datum, less, ...} => -				case Key.compare (firstKey, key) of -					LESS => Stream.getItem ( -						downFrom (less, firstKey) -					) | EQUAL => SOME ( -						(key, datum) -						, down less -					) | GREATER => Stream.getItem ( -						Stream.append ( -							downFrom (greater, firstKey) -							, Stream.cons ( -								(key, datum) -								, down less -							) -						) -					) -	) -	fun fromStream stream = -		Stream.fold (fn ((key, datum), tree) => -			add (tree, key, datum) -		) empty stream -	fun fromList list = fromStream (Stream.fromList list) -end | 
