src/HOL/Import/seq.ML
author obua
Thu, 16 Feb 2006 23:30:47 +0100
changeset 19089 2e487fe9593a
child 19095 9497f7b174be
permissions -rw-r--r--
improved scanning
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
19089
2e487fe9593a improved scanning
obua
parents:
diff changeset
     1
signature SCANNER_SEQ =
2e487fe9593a improved scanning
obua
parents:
diff changeset
     2
sig
2e487fe9593a improved scanning
obua
parents:
diff changeset
     3
    type 'a seq
2e487fe9593a improved scanning
obua
parents:
diff changeset
     4
    
2e487fe9593a improved scanning
obua
parents:
diff changeset
     5
    val pull : 'a seq -> ('a * 'a seq) option 
2e487fe9593a improved scanning
obua
parents:
diff changeset
     6
end
2e487fe9593a improved scanning
obua
parents:
diff changeset
     7
2e487fe9593a improved scanning
obua
parents:
diff changeset
     8
signature EXTENDED_SCANNER_SEQ =
2e487fe9593a improved scanning
obua
parents:
diff changeset
     9
sig
2e487fe9593a improved scanning
obua
parents:
diff changeset
    10
2e487fe9593a improved scanning
obua
parents:
diff changeset
    11
  include SCANNER_SEQ
2e487fe9593a improved scanning
obua
parents:
diff changeset
    12
2e487fe9593a improved scanning
obua
parents:
diff changeset
    13
  val null : 'a seq -> bool
2e487fe9593a improved scanning
obua
parents:
diff changeset
    14
  val length : 'a seq -> int
2e487fe9593a improved scanning
obua
parents:
diff changeset
    15
  val take_at_most : 'a seq -> int -> 'a list
2e487fe9593a improved scanning
obua
parents:
diff changeset
    16
2e487fe9593a improved scanning
obua
parents:
diff changeset
    17
end
2e487fe9593a improved scanning
obua
parents:
diff changeset
    18
2e487fe9593a improved scanning
obua
parents:
diff changeset
    19
functor ExtendScannerSeq (structure Seq : SCANNER_SEQ) : EXTENDED_SCANNER_SEQ =
2e487fe9593a improved scanning
obua
parents:
diff changeset
    20
struct
2e487fe9593a improved scanning
obua
parents:
diff changeset
    21
  
2e487fe9593a improved scanning
obua
parents:
diff changeset
    22
type 'a seq = 'a Seq.seq
2e487fe9593a improved scanning
obua
parents:
diff changeset
    23
2e487fe9593a improved scanning
obua
parents:
diff changeset
    24
val pull = Seq.pull
2e487fe9593a improved scanning
obua
parents:
diff changeset
    25
2e487fe9593a improved scanning
obua
parents:
diff changeset
    26
fun null s = is_none (pull s)
2e487fe9593a improved scanning
obua
parents:
diff changeset
    27
2e487fe9593a improved scanning
obua
parents:
diff changeset
    28
fun take_at_most s n = 
2e487fe9593a improved scanning
obua
parents:
diff changeset
    29
    if n <= 0 then [] else
2e487fe9593a improved scanning
obua
parents:
diff changeset
    30
    case pull s of 
2e487fe9593a improved scanning
obua
parents:
diff changeset
    31
	NONE => []
2e487fe9593a improved scanning
obua
parents:
diff changeset
    32
      | SOME (x,s') => x::(take_at_most s' (n-1))
2e487fe9593a improved scanning
obua
parents:
diff changeset
    33
2e487fe9593a improved scanning
obua
parents:
diff changeset
    34
fun length' s n = 
2e487fe9593a improved scanning
obua
parents:
diff changeset
    35
    case pull s of
2e487fe9593a improved scanning
obua
parents:
diff changeset
    36
	NONE => n
2e487fe9593a improved scanning
obua
parents:
diff changeset
    37
      | SOME (_, s') => length' s' (n+1)
2e487fe9593a improved scanning
obua
parents:
diff changeset
    38
2e487fe9593a improved scanning
obua
parents:
diff changeset
    39
fun length s = length' s 0
2e487fe9593a improved scanning
obua
parents:
diff changeset
    40
		
2e487fe9593a improved scanning
obua
parents:
diff changeset
    41
end  
2e487fe9593a improved scanning
obua
parents:
diff changeset
    42
2e487fe9593a improved scanning
obua
parents:
diff changeset
    43
signature VECTOR_SCANNER_SEQ = 
2e487fe9593a improved scanning
obua
parents:
diff changeset
    44
sig
2e487fe9593a improved scanning
obua
parents:
diff changeset
    45
    include EXTENDED_SCANNER_SEQ
2e487fe9593a improved scanning
obua
parents:
diff changeset
    46
2e487fe9593a improved scanning
obua
parents:
diff changeset
    47
    val fromString : string -> string seq
2e487fe9593a improved scanning
obua
parents:
diff changeset
    48
    val fromVector : 'a Vector.vector -> 'a seq
2e487fe9593a improved scanning
obua
parents:
diff changeset
    49
end
2e487fe9593a improved scanning
obua
parents:
diff changeset
    50
2e487fe9593a improved scanning
obua
parents:
diff changeset
    51
structure VectorScannerSeq :> VECTOR_SCANNER_SEQ =
2e487fe9593a improved scanning
obua
parents:
diff changeset
    52
struct
2e487fe9593a improved scanning
obua
parents:
diff changeset
    53
  
2e487fe9593a improved scanning
obua
parents:
diff changeset
    54
structure Incubator : SCANNER_SEQ =
2e487fe9593a improved scanning
obua
parents:
diff changeset
    55
struct
2e487fe9593a improved scanning
obua
parents:
diff changeset
    56
2e487fe9593a improved scanning
obua
parents:
diff changeset
    57
type 'a seq = 'a Vector.vector * int * int
2e487fe9593a improved scanning
obua
parents:
diff changeset
    58
fun pull (v, len, i) = if i >= len then NONE else SOME (Vector.sub (v, i), (v, len, i+1))
2e487fe9593a improved scanning
obua
parents:
diff changeset
    59
2e487fe9593a improved scanning
obua
parents:
diff changeset
    60
end
2e487fe9593a improved scanning
obua
parents:
diff changeset
    61
2e487fe9593a improved scanning
obua
parents:
diff changeset
    62
structure Extended = ExtendScannerSeq (structure Seq = Incubator)
2e487fe9593a improved scanning
obua
parents:
diff changeset
    63
2e487fe9593a improved scanning
obua
parents:
diff changeset
    64
open Extended
2e487fe9593a improved scanning
obua
parents:
diff changeset
    65
2e487fe9593a improved scanning
obua
parents:
diff changeset
    66
fun fromVector v = (v, Vector.length v, 0)
2e487fe9593a improved scanning
obua
parents:
diff changeset
    67
fun vector_from_string s = Vector.tabulate (String.size s, fn i => String.str (String.sub (s, i)))
2e487fe9593a improved scanning
obua
parents:
diff changeset
    68
fun fromString s = fromVector (vector_from_string s)
2e487fe9593a improved scanning
obua
parents:
diff changeset
    69
2e487fe9593a improved scanning
obua
parents:
diff changeset
    70
end
2e487fe9593a improved scanning
obua
parents:
diff changeset
    71
2e487fe9593a improved scanning
obua
parents:
diff changeset
    72
signature LIST_SCANNER_SEQ =
2e487fe9593a improved scanning
obua
parents:
diff changeset
    73
sig
2e487fe9593a improved scanning
obua
parents:
diff changeset
    74
    include EXTENDED_SCANNER_SEQ
2e487fe9593a improved scanning
obua
parents:
diff changeset
    75
    
2e487fe9593a improved scanning
obua
parents:
diff changeset
    76
    val fromString : string -> string seq
2e487fe9593a improved scanning
obua
parents:
diff changeset
    77
    val fromList : 'a list -> 'a seq
2e487fe9593a improved scanning
obua
parents:
diff changeset
    78
end
2e487fe9593a improved scanning
obua
parents:
diff changeset
    79
2e487fe9593a improved scanning
obua
parents:
diff changeset
    80
structure ListScannerSeq :> LIST_SCANNER_SEQ =
2e487fe9593a improved scanning
obua
parents:
diff changeset
    81
struct
2e487fe9593a improved scanning
obua
parents:
diff changeset
    82
     
2e487fe9593a improved scanning
obua
parents:
diff changeset
    83
structure Incubator : SCANNER_SEQ =
2e487fe9593a improved scanning
obua
parents:
diff changeset
    84
struct
2e487fe9593a improved scanning
obua
parents:
diff changeset
    85
2e487fe9593a improved scanning
obua
parents:
diff changeset
    86
type 'a seq = 'a list
2e487fe9593a improved scanning
obua
parents:
diff changeset
    87
fun pull [] = NONE
2e487fe9593a improved scanning
obua
parents:
diff changeset
    88
  | pull (x::xs) = SOME (x, xs)
2e487fe9593a improved scanning
obua
parents:
diff changeset
    89
2e487fe9593a improved scanning
obua
parents:
diff changeset
    90
end
2e487fe9593a improved scanning
obua
parents:
diff changeset
    91
2e487fe9593a improved scanning
obua
parents:
diff changeset
    92
structure Extended = ExtendScannerSeq (structure Seq = Incubator)
2e487fe9593a improved scanning
obua
parents:
diff changeset
    93
2e487fe9593a improved scanning
obua
parents:
diff changeset
    94
open Extended
2e487fe9593a improved scanning
obua
parents:
diff changeset
    95
2e487fe9593a improved scanning
obua
parents:
diff changeset
    96
val fromList = I
2e487fe9593a improved scanning
obua
parents:
diff changeset
    97
val fromString = Symbol.explode
2e487fe9593a improved scanning
obua
parents:
diff changeset
    98
2e487fe9593a improved scanning
obua
parents:
diff changeset
    99
end