retroforth/interface/dedup.retro
crc f7310bb6cc move malloc & double to package/extensions
FossilOrigin-Name: 072c6e6b0eb0f21ce985d84fc8c5f032172e3116ec765c61d85fb60aa3ff74d4
2023-10-23 18:23:23 +00:00

41 lines
935 B
Forth

# s:dedup
String deduplication for RetroForth.
(c) Arland Childers
~~~
'init s:keep fll:create 's:dedup.data var-n
{{
'Temp d:create #1024 allot
't1 var
't2 var
---reveal---
:s:dedup.register (s-)
s:keep @s:dedup.data swap &fll:append/value sip ;
:s:dedup.defined? (s-f)
!t1 #0 !t2
@s:dedup.data [ @t1 s:eq? @t2 or !t2 ] fll:for-each @t2 ;
:s:dedup.find (s-s)
!t1 #0 !t2
@s:dedup.data [ dup @t1 s:eq? [ !t2 ] &drop choose ]
fll:for-each @t2 ;
:s:dedup (s-s)
&Temp s:copy &Temp
dup s:dedup.defined? &s:dedup.find &s:dedup.register
choose ;
:s:unique? (s-f) s:dedup.defined? ;
}}
~~~
~~~
'interface/dedup.retro s:dedup
dup 's:unique? d:lookup d:source store
dup 's:dedup d:lookup d:source store
dup 's:dedup.find d:lookup d:source store
dup 's:dedup.defined? d:lookup d:source store
dup 's:dedup.register d:lookup d:source store
dup 's:dedup.data d:lookup d:source store
drop
~~~