1 ! Copyright (C) 2010 Dmitry Shubin.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: arrays kernel locals math math.ranges sequences
7 : lcp ( seq1 seq2 -- n )
8 [ min-length dup ] 2keep mismatch-unsafe [ nip ] when* ;
12 :: out-of-zbox ( seq Z l r k -- seq Z l r )
13 seq k tail-slice seq lcp :> Zk
15 Zk 0 > [ k Zk k + 1 - ] [ l r ] if ; inline
17 :: inside-zbox ( seq Z l r k -- seq Z l r )
21 [ Zk' k Z set-nth l r ] ! still inside
23 seq r 1 + seq b [ tail-slice ] 2bi@ lcp :> q
24 q b + k Z set-nth k q r +
27 : z-value ( seq Z l r k -- seq Z l r )
28 2dup < [ out-of-zbox ] [ inside-zbox ] if ; inline
30 :: (z-values) ( seq -- Z )
31 seq length dup 0 <array> :> ( len Z )
33 seq Z 0 0 len [1,b) [ z-value ] each 4drop
38 : z-values ( seq -- Z )
39 [ { } ] [ (z-values) ] if-empty ;