src/HOL/Import/mono_seq.ML
author wenzelm
Thu, 27 May 2010 18:10:37 +0200
changeset 37146 f652333bbf8e
parent 32960 69916a850301
child 41589 bbd861837ebc
permissions -rw-r--r--
renamed structure PrintMode to Print_Mode, keeping the old name as legacy alias for some time;
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 
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 19093
diff changeset
    41
        NONE => []
19093
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
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 19093
diff changeset
    46
        NONE => n
19093
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
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 19093
diff changeset
    50
                
19093
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 : 
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 19093
diff changeset
    55
          sig 
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 19093
diff changeset
    56
              include MONO_EXTENDED_SCANNER_SEQ 
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 19093
diff changeset
    57
              val fromString : string -> seq
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 19093
diff changeset
    58
          end
19093
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