src/Pure/General/scan.ML
changeset 14726 9657c23cc3e7
parent 14686 708c613370ab
child 14833 30556b84af7c
equal deleted inserted replaced
14725:2ed5b960c6b1 14726:9657c23cc3e7
    28   val --| : ('a -> 'b * 'c) * ('c -> 'd * 'e) -> 'a -> 'b * 'e
    28   val --| : ('a -> 'b * 'c) * ('c -> 'd * 'e) -> 'a -> 'b * 'e
    29   (*concatenation*)
    29   (*concatenation*)
    30   val ^^ : ('a -> string * 'b) * ('b -> string * 'c) -> 'a -> string * 'c
    30   val ^^ : ('a -> string * 'b) * ('b -> string * 'c) -> 'a -> string * 'c
    31   (*one element literal*)
    31   (*one element literal*)
    32   val $$ : ''a -> ''a list -> ''a * ''a list
    32   val $$ : ''a -> ''a list -> ''a * ''a list
       
    33   (*literal list*)
       
    34   val list: ''a list -> ''a list -> ''a list * ''a list
    33 end;
    35 end;
    34 
    36 
    35 signature SCAN =
    37 signature SCAN =
    36 sig
    38 sig
    37   include BASIC_SCAN
    39   include BASIC_SCAN
   147 
   149 
   148 fun $$ _ [] = raise MORE None
   150 fun $$ _ [] = raise MORE None
   149   | $$ a (x :: xs) =
   151   | $$ a (x :: xs) =
   150       if a = x then (x, xs) else raise FAIL None;
   152       if a = x then (x, xs) else raise FAIL None;
   151 
   153 
       
   154 fun list ys xs =
       
   155   let
       
   156     fun drop_prefix [] xs = xs
       
   157       | drop_prefix (_ :: _) [] = raise MORE None
       
   158       | drop_prefix (y :: ys) (x :: xs) =
       
   159           if y = x then drop_prefix ys xs else raise FAIL None;
       
   160   in (ys, drop_prefix ys xs) end;
       
   161 
   152 fun any _ [] = raise MORE None
   162 fun any _ [] = raise MORE None
   153   | any pred (lst as x :: xs) =
   163   | any pred (lst as x :: xs) =
   154       if pred x then apfst (cons x) (any pred xs)
   164       if pred x then apfst (cons x) (any pred xs)
   155       else ([], lst);
   165       else ([], lst);
   156 
   166