src/HOL/Import/mono_seq.ML
changeset 19093 6d584f9d2021
child 32960 69916a850301
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/HOL/Import/mono_seq.ML	Fri Feb 17 03:30:50 2006 +0100
@@ -0,0 +1,77 @@
+(*  Title:      HOL/Import/mono_seq.ML
+    ID:         $Id$
+    Author:     Steven Obua, TU Muenchen
+
+    Monomorphic sequences.
+*)
+
+(* The trouble is that signature / structures cannot depend on type variable parameters ... *)
+
+signature MONO_SCANNER_SEQ =
+sig
+    type seq
+    type item
+    
+    val pull : seq -> (item * seq) option 
+end
+
+signature MONO_EXTENDED_SCANNER_SEQ =
+sig
+
+  include MONO_SCANNER_SEQ
+
+  val null : seq -> bool
+  val length : seq -> int
+  val take_at_most : seq -> int -> item list
+
+end
+
+functor MonoExtendScannerSeq (structure Seq : MONO_SCANNER_SEQ) : MONO_EXTENDED_SCANNER_SEQ =
+struct
+  
+type seq = Seq.seq
+type item = Seq.item
+val pull = Seq.pull
+
+fun null s = is_none (pull s)
+
+fun take_at_most s n = 
+    if n <= 0 then [] else
+    case pull s of 
+	NONE => []
+      | SOME (x,s') => x::(take_at_most s' (n-1))
+
+fun length' s n = 
+    case pull s of
+	NONE => n
+      | SOME (_, s') => length' s' (n+1)
+
+fun length s = length' s 0
+		
+end  
+
+
+structure StringScannerSeq : 
+	  sig 
+	      include MONO_EXTENDED_SCANNER_SEQ 
+	      val fromString : string -> seq
+	  end
+  =
+struct
+
+structure Incubator : MONO_SCANNER_SEQ =
+struct
+
+type seq = string * int * int
+type item = string
+
+fun pull (s, len, i) = if i >= len then NONE else SOME (String.substring (s, i, 1), (s, len, i+1))
+end
+
+structure Extended = MonoExtendScannerSeq (structure Seq = Incubator)
+open Extended
+
+fun fromString s = (s, String.size s, 0)
+
+end
+