src/HOL/Import/mono_seq.ML
author wenzelm
Mon, 16 Mar 2009 18:24:30 +0100
changeset 30549 d2d7874648bd
parent 19093 6d584f9d2021
child 32960 69916a850301
permissions -rw-r--r--
simplified method setup;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
19093
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
     1
(*  Title:      HOL/Import/mono_seq.ML
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
     2
    ID:         $Id$
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
     3
    Author:     Steven Obua, TU Muenchen
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
     4
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
     5
    Monomorphic sequences.
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
     6
*)
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
     7
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
     8
(* The trouble is that signature / structures cannot depend on type variable parameters ... *)
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
     9
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    10
signature MONO_SCANNER_SEQ =
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    11
sig
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    12
    type seq
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    13
    type item
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    14
    
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    15
    val pull : seq -> (item * seq) option 
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    16
end
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    17
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    18
signature MONO_EXTENDED_SCANNER_SEQ =
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    19
sig
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    20
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    21
  include MONO_SCANNER_SEQ
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    22
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    23
  val null : seq -> bool
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    24
  val length : seq -> int
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    25
  val take_at_most : seq -> int -> item list
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    26
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    27
end
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    28
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    29
functor MonoExtendScannerSeq (structure Seq : MONO_SCANNER_SEQ) : MONO_EXTENDED_SCANNER_SEQ =
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    30
struct
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    31
  
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    32
type seq = Seq.seq
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    33
type item = Seq.item
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    34
val pull = Seq.pull
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    35
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    36
fun null s = is_none (pull s)
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    37
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    38
fun take_at_most s n = 
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    39
    if n <= 0 then [] else
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    40
    case pull s of 
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    41
	NONE => []
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    42
      | SOME (x,s') => x::(take_at_most s' (n-1))
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    43
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    44
fun length' s n = 
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    45
    case pull s of
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    46
	NONE => n
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    47
      | SOME (_, s') => length' s' (n+1)
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    48
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    49
fun length s = length' s 0
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    50
		
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    51
end  
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    52
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    53
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    54
structure StringScannerSeq : 
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    55
	  sig 
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    56
	      include MONO_EXTENDED_SCANNER_SEQ 
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    57
	      val fromString : string -> seq
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    58
	  end
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    59
  =
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    60
struct
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    61
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    62
structure Incubator : MONO_SCANNER_SEQ =
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    63
struct
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    64
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    65
type seq = string * int * int
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    66
type item = string
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    67
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    68
fun pull (s, len, i) = if i >= len then NONE else SOME (String.substring (s, i, 1), (s, len, i+1))
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    69
end
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    70
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    71
structure Extended = MonoExtendScannerSeq (structure Seq = Incubator)
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    72
open Extended
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    73
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    74
fun fromString s = (s, String.size s, 0)
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    75
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    76
end
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    77