src/HOL/Import/mono_seq.ML
author wenzelm
Sun, 30 Jan 2011 13:02:18 +0100
changeset 41648 6d736d983d5c
parent 41589 bbd861837ebc
permissions -rw-r--r--
clarified example settings for Proof General;
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
    Author:     Steven Obua, TU Muenchen
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
     3
41589
bbd861837ebc tuned headers;
wenzelm
parents: 32960
diff changeset
     4
Monomorphic sequences.
19093
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
     5
*)
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
     6
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
     7
(* The trouble is that signature / structures cannot depend on type variable parameters ... *)
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
     8
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
     9
signature MONO_SCANNER_SEQ =
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    10
sig
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    11
    type seq
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    12
    type item
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    13
    
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    14
    val pull : seq -> (item * seq) option 
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    15
end
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    16
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    17
signature MONO_EXTENDED_SCANNER_SEQ =
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    18
sig
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    19
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    20
  include MONO_SCANNER_SEQ
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    21
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    22
  val null : seq -> bool
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    23
  val length : seq -> int
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    24
  val take_at_most : seq -> int -> item list
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    25
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    26
end
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    27
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    28
functor MonoExtendScannerSeq (structure Seq : MONO_SCANNER_SEQ) : MONO_EXTENDED_SCANNER_SEQ =
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    29
struct
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    30
  
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    31
type seq = Seq.seq
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    32
type item = Seq.item
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    33
val pull = Seq.pull
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    34
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    35
fun null s = is_none (pull s)
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    36
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    37
fun take_at_most s n = 
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    38
    if n <= 0 then [] else
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    39
    case pull s of 
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 19093
diff changeset
    40
        NONE => []
19093
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    41
      | SOME (x,s') => x::(take_at_most s' (n-1))
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    42
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    43
fun length' s n = 
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    44
    case pull s of
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 19093
diff changeset
    45
        NONE => n
19093
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    46
      | SOME (_, s') => length' s' (n+1)
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    47
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    48
fun length s = length' s 0
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 19093
diff changeset
    49
                
19093
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    50
end  
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    51
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    52
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    53
structure StringScannerSeq : 
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 19093
diff changeset
    54
          sig 
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 19093
diff changeset
    55
              include MONO_EXTENDED_SCANNER_SEQ 
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 19093
diff changeset
    56
              val fromString : string -> seq
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 19093
diff changeset
    57
          end
19093
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    58
  =
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    59
struct
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    60
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    61
structure Incubator : MONO_SCANNER_SEQ =
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    62
struct
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    63
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    64
type seq = string * int * int
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    65
type item = string
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    66
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    67
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
    68
end
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    69
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    70
structure Extended = MonoExtendScannerSeq (structure Seq = Incubator)
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    71
open Extended
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    72
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    73
fun fromString s = (s, String.size s, 0)
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    74
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    75
end
6d584f9d2021 use monomorphic sequences / scanners
obua
parents:
diff changeset
    76