mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			76 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Standard ML
		
	
	
	
	
	
			
		
		
	
	
			76 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Standard ML
		
	
	
	
	
	
| 
 | |
| structure LazyBase:> LAZY_BASE =
 | |
|    struct
 | |
|       type 'a lazy = unit -> 'a
 | |
| 
 | |
|       exception Undefined
 | |
| 
 | |
|       fun delay f = f
 | |
| 
 | |
|       fun force f = f()
 | |
| 
 | |
|       val undefined = fn () => raise Undefined
 | |
|    end
 | |
| 
 | |
| structure LazyMemoBase:> LAZY_BASE =
 | |
|    struct 
 | |
| 
 | |
|       datatype 'a susp = NotYet of unit -> 'a
 | |
|                        | Done of 'a
 | |
| 
 | |
|       type 'a lazy = unit -> 'a susp ref
 | |
| 
 | |
|       exception Undefined
 | |
| 
 | |
|       fun delay f = 
 | |
|           let 
 | |
|              val r = ref (NotYet f)
 | |
|           in
 | |
|              fn () => r
 | |
|           end
 | |
| 
 | |
|       fun force f = 
 | |
|           case f() of
 | |
|              ref (Done x) => x
 | |
|            | r as ref (NotYet f') =>
 | |
|              let
 | |
|                 val a = f'()
 | |
|              in
 | |
|                 r := Done a
 | |
|               ; a
 | |
|              end
 | |
| 
 | |
|       val undefined = fn () => raise Undefined
 | |
|    end
 | |
| 
 | |
| functor LazyFn(B: LAZY_BASE): LAZY' =
 | |
|    struct
 | |
| 
 | |
|       open B
 | |
| 
 | |
|       fun inject x = delay (fn () => x)
 | |
| 
 | |
|       fun isUndefined x =
 | |
|           (ignore (force x)
 | |
|          ; false)
 | |
|           handle Undefined => true
 | |
|                               
 | |
|       fun toString f x = if isUndefined x then "_|_" else f (force x)
 | |
| 
 | |
|       fun eqBy p (x,y) = p(force x,force y)
 | |
|       fun eq (x,y) = eqBy op= (x,y)
 | |
|       fun compare p (x,y) = p(force x,force y)
 | |
| 
 | |
|       structure Ops = 
 | |
|          struct 
 | |
|             val ! = force
 | |
|             val ? = inject
 | |
|          end
 | |
| 
 | |
|       fun map f x = delay (fn () => f (force x))
 | |
| 
 | |
|    end
 | |
| 
 | |
| structure Lazy' = LazyFn(LazyBase)
 | |
| structure LazyMemo = LazyFn(LazyMemoBase)
 |