FileSystem (Polyglot)¶
In [ ]:
#r @"../../../../../../../.nuget/packages/fsharp.control.asyncseq/3.2.1/lib/netstandard2.1/FSharp.Control.AsyncSeq.dll"
#r @"../../../../../../../.nuget/packages/system.reactive/6.0.1-preview.1/lib/net6.0/System.Reactive.dll"
#r @"../../../../../../../.nuget/packages/system.reactive.linq/6.0.1-preview.1/lib/netstandard2.0/System.Reactive.Linq.dll"
#r @"../../../../../../../.nuget/packages/argu/6.2.4/lib/netstandard2.0/Argu.dll"
In [ ]:
#!import ../../lib/fsharp/Notebooks.dib
#!import ../../lib/fsharp/Testing.dib
In [ ]:
#!import ../../lib/fsharp/Common.fs
#!import ../../lib/fsharp/CommonFSharp.fs
#!import ../../lib/fsharp/Async.fs
#!import ../../lib/fsharp/AsyncSeq.fs
#!import ../../lib/fsharp/Runtime.fs
In [ ]:
#if !INTERACTIVE
open Lib
#endif
In [ ]:
open Common
open SpiralFileSystem.Operators
watchDirectory¶
In [ ]:
[<RequireQualifiedAccess>]
type FileSystemChangeType =
| Failure
| Changed
| Created
| Deleted
| Renamed
[<RequireQualifiedAccess>]
type FileSystemChange =
| Failure of exn: exn
| Changed of path: string * content: string option
| Created of path: string * content: string option
| Deleted of path: string
| Renamed of oldPath: string * (string * string option)
let inline watchDirectoryWithFilter filter shouldReadContent path =
let fullPath = path |> System.IO.Path.GetFullPath
let _locals () = $"filter: {filter} / {_locals ()}"
let watcher =
new System.IO.FileSystemWatcher (
Path = fullPath,
NotifyFilter = filter,
EnableRaisingEvents = true,
IncludeSubdirectories = true
)
let inline getEventPath (path : string) =
path |> SpiralSm.trim |> SpiralSm.replace fullPath "" |> SpiralSm.trim_start [| '/'; '\\' |]
let inline ticks () =
System.DateTime.UtcNow.Ticks
let changedStream =
AsyncSeq.subscribeEvent
watcher.Changed
(fun event ->
ticks (),
[ FileSystemChange.Changed (getEventPath event.FullPath, None) ]
)
let deletedStream =
AsyncSeq.subscribeEvent
watcher.Deleted
(fun event ->
ticks (),
[ FileSystemChange.Deleted (getEventPath event.FullPath) ]
)
let createdStream =
AsyncSeq.subscribeEvent
watcher.Created
(fun event ->
let path = getEventPath event.FullPath
ticks (), [
FileSystemChange.Created (path, None)
if SpiralPlatform.is_windows () then
FileSystemChange.Changed (path, None)
])
let renamedStream =
AsyncSeq.subscribeEvent
watcher.Renamed
(fun event ->
ticks (), [
FileSystemChange.Renamed (
getEventPath event.OldFullPath,
(getEventPath event.FullPath, None)
)
]
)
let failureStream =
AsyncSeq.subscribeEvent
watcher.Error
(fun event -> ticks (), [ FileSystemChange.Failure (event.GetException ()) ])
let stream =
[
changedStream
deletedStream
createdStream
renamedStream
failureStream
]
|> FSharp.Control.AsyncSeq.mergeAll
|> FSharp.Control.AsyncSeq.map (fun (t, events) ->
events
|> List.fold
(fun (i, events) event ->
i + 1L,
(t + i, event) :: events)
(0L, [])
|> snd
|> List.rev
)
|> FSharp.Control.AsyncSeq.concatSeq
|> FSharp.Control.AsyncSeq.mapAsyncParallel (fun (t, event) -> async {
match shouldReadContent event, event with
| true, FileSystemChange.Changed (path, _) ->
do! Async.Sleep 5
let! content = fullPath </> path |> SpiralFileSystem.read_all_text_retry_async
return t, FileSystemChange.Changed (path, content)
| true, FileSystemChange.Created (path, _) ->
do! Async.Sleep 5
let! content = fullPath </> path |> SpiralFileSystem.read_all_text_retry_async
return t, FileSystemChange.Created (path, content)
| true, FileSystemChange.Renamed (oldPath, (newPath, _)) ->
let! content = fullPath </> newPath |> SpiralFileSystem.read_all_text_retry_async
return t, FileSystemChange.Renamed (oldPath, (newPath, content))
| _ -> return t, event
})
let disposable =
new_disposable (fun () ->
trace Debug (fun () -> "FileSystem.watchWithFilter / Disposing watch stream") _locals
watcher.EnableRaisingEvents <- false
watcher.Dispose ()
)
stream, disposable
let inline watchDirectory path =
watchDirectoryWithFilter
(System.IO.NotifyFilters.FileName
// ||| System.IO.NotifyFilters.DirectoryName
// ||| System.IO.NotifyFilters.Attributes
//// ||| System.IO.NotifyFilters.Size
||| System.IO.NotifyFilters.LastWrite
//// ||| System.IO.NotifyFilters.LastAccess
// ||| System.IO.NotifyFilters.CreationTime
// ||| System.IO.NotifyFilters.Security
)
path
testEventsRaw (test)¶
In [ ]:
//// test
let inline testEventsRaw
(watchFn : (_ -> bool) -> string -> FSharp.Control.AsyncSeq<int64 * FileSystemChange> * IDisposable)
write
=
let struct (tempDir, tempDisposable) =
"FileSystem.testEventsRaw"
|> SpiralCrypto.hash_text
|> SpiralFileSystem.create_temp_dir'
let stream, disposable = watchFn (fun _ -> true) tempDir
let events = System.Collections.Concurrent.ConcurrentBag ()
let inline iter () =
stream
|> FSharp.Control.AsyncSeq.iterAsyncParallel (fun event -> async { events.Add event })
let run = async {
let! _ = iter () |> Async.StartChild
do! Async.Sleep 250
return! write tempDir
}
try
run
|> Async.runWithTimeout 60000
|> _assertEqual (Some ())
finally
disposable.Dispose ()
tempDisposable.Dispose ()
let eventsLog =
events
|> Seq.toList
|> List.sortBy fst
|> List.fold
(fun (prev, acc) (ticks, event) ->
ticks, (ticks, (if prev = 0L then 0L else ticks - prev), event) :: acc
)
(0L, [])
|> snd
|> List.rev
|> List.map (fun (diff, n, event) -> $"{n} / {diff} / {event}" |> SpiralSm.ellipsis_end 100L)
|> SpiralSm.concat "\n"
let _locals () = $"eventsLog: \n{eventsLog} / {_locals ()}"
trace Debug (fun () -> "FileSystem.testEventsRaw") _locals
events
|> Seq.toList
|> List.sortBy fst
|> List.map snd
|> List.fold
(fun acc event ->
match acc, event with
| FileSystemChange.Changed (lastPath, Some lastContent) as lastEvent :: acc,
FileSystemChange.Changed (path, Some content)
when lastPath = path && content |> SpiralSm.starts_with lastContent
->
event :: acc
| _ -> event :: acc
)
[]
|> List.rev
fast (test)¶
In [ ]:
//// test
let inline write path = async {
let n = 2
for i = 1 to n do
do! $"a{i}" |> SpiralFileSystem.write_all_text_async (path </> $"file{i}.txt")
do! Async.Sleep 250
for i = 1 to n do
do! $"b{i}" |> SpiralFileSystem.write_all_text_async (path </> $"file{i}.txt")
do! Async.Sleep 250
for i = 1 to n do
do! path </> $"file{i}.txt" |> SpiralFileSystem.move_file_async (path </> $"file_{i}.txt") |> Async.Ignore
do! Async.Sleep 250
for i = 1 to n do
do! $"c{i}" |> SpiralFileSystem.write_all_text_async (path </> $"file_{i}.txt")
do! Async.Sleep 250
for i = 1 to n do
do! SpiralFileSystem.delete_file_async (path </> $"file_{i}.txt") |> Async.Ignore
do! Async.Sleep 250
}
let inline run () =
let events = testEventsRaw watchDirectory write
events
|> _sequenceEqual [
FileSystemChange.Created ("file1.txt", Some "a1")
FileSystemChange.Changed ("file1.txt", Some "a1")
FileSystemChange.Created ("file2.txt", Some "a2")
FileSystemChange.Changed ("file2.txt", Some "a2")
FileSystemChange.Changed ("file1.txt", Some "b1")
FileSystemChange.Changed ("file2.txt", Some "b2")
FileSystemChange.Renamed ("file1.txt", ("file_1.txt", Some "b1"))
FileSystemChange.Renamed ("file2.txt", ("file_2.txt", Some "b2"))
FileSystemChange.Changed ("file_1.txt", Some "c1")
FileSystemChange.Changed ("file_2.txt", Some "c2")
FileSystemChange.Deleted "file_1.txt"
FileSystemChange.Deleted "file_2.txt"
]
run
|> retry_fn 3
|> _assertEqual (Some ())
Some () 00:00:03 d #1 FileSystem.watchWithFilter / Disposing watch stream / filter: FileName, LastWrite 00:00:03 d #2 FileSystem.testEventsRaw / eventsLog: 0 / 638664717645805793 / Created ("file1.txt", Some "a1") 14023 / 638664717645819816 / Changed ("file1.txt", Some "a1") 2302 / 638664717645822118 / Created ("file2.txt", Some "a2") 51 / 638664717645822169 / Changed ("file2.txt", Some "a2") 2503331 / 638664717648325500 / Changed ("file1.txt", Some "b1") 4450 / 638664717648329950 / Changed ("file1.txt", Some "b1") 5497 / 638664717648335447 / Changed ("file2.txt", Some "b2") 241 / 638664717648335688 / Changed ("file2.txt", Some "b2") 2582281 / 638664717650917969 / Renamed ("file1.txt", ("file_1.txt", Some "b1")) 6884 / 638664717650924853 / Renamed ("file2.txt", ("file_2.txt", Some "b2")) 2530483 / 638664717653455336 / Changed ("file_1.txt", Some "c1") 442 / 638664717653455778 / Changed ("file_1.txt", Some "c1") 4496 / 638664717653460274 / Changed ("file_2.txt", Some "c2") 2494 / 638664717653462768 / Changed ("file_2.txt", Some "c2") 2543448 / 638664717656006216 / Deleted "file_1.txt" 2281 / 638664717656008497 / Deleted "file_2.txt" [Created ("file1.txt", Some "a1"); Changed ("file1.txt", Some "a1"); Created ("file2.txt", Some "a2"); Changed ("file2.txt", Some "a2"); Changed ("file1.txt", Some "b1"); Changed ("file2.txt", Some "b2"); Renamed ("file1.txt", ("file_1.txt", Some "b1")); Renamed ("file2.txt", ("file_2.txt", Some "b2")); Changed ("file_1.txt", Some "c1"); Changed ("file_2.txt", Some "c2"); Deleted "file_1.txt"; Deleted "file_2.txt"] Some ()
slow (test)¶
In [ ]:
//// test
let inline write path = async {
let n = 2
let contents =
[ 1 .. n ]
|> List.map (string >> String.replicate 1_000_000)
for i = 1 to n do
do! $"{contents.[i - 1]}a" |> SpiralFileSystem.write_all_text_async (path </> $"file{i}.txt")
do! Async.Sleep 1500
for i = 1 to n do
do! $"{contents.[i - 1]}b" |> SpiralFileSystem.write_all_text_async (path </> $"file{i}.txt")
do! Async.Sleep 1500
for i = 1 to n do
do! path </> $"file{i}.txt" |> SpiralFileSystem.move_file_async (path </> $"file_{i}.txt") |> Async.Ignore
do! Async.Sleep 1500
for i = 1 to n do
do! $"{contents.[i - 1]}c" |> SpiralFileSystem.write_all_text_async (path </> $"file_{i}.txt")
do! Async.Sleep 1500
for i = 1 to n do
do! SpiralFileSystem.delete_file_async (path </> $"file_{i}.txt") |> Async.Ignore
do! Async.Sleep 1500
}
let inline run () =
let events =
testEventsRaw watchDirectory write
|> List.map (function
| FileSystemChange.Changed (path, Some content) ->
FileSystemChange.Changed (path, content |> Seq.distinct |> Seq.map string |> SpiralSm.concat "" |> Some)
| FileSystemChange.Created (path, Some content) ->
FileSystemChange.Created (path, content |> Seq.distinct |> Seq.map string |> SpiralSm.concat "" |> Some)
| FileSystemChange.Renamed (oldPath, (newPath, Some content)) ->
FileSystemChange.Renamed (
oldPath,
(newPath, content |> Seq.distinct |> Seq.map string |> SpiralSm.concat "" |> Some)
)
| event -> event
)
events
|> _sequenceEqual [
FileSystemChange.Created ("file1.txt", Some "1a")
FileSystemChange.Changed ("file1.txt", Some "1a")
FileSystemChange.Created ("file2.txt", Some "2a")
FileSystemChange.Changed ("file2.txt", Some "2a")
FileSystemChange.Changed ("file1.txt", Some "1b")
FileSystemChange.Changed ("file2.txt", Some "2b")
FileSystemChange.Renamed ("file1.txt", ("file_1.txt", Some "1b"))
FileSystemChange.Renamed ("file2.txt", ("file_2.txt", Some "2b"))
FileSystemChange.Changed ("file_1.txt", Some "1c")
FileSystemChange.Changed ("file_2.txt", Some "2c")
FileSystemChange.Deleted "file_1.txt"
FileSystemChange.Deleted "file_2.txt"
]
run
|> retry_fn 5
|> _assertEqual (Some ())
Some () 00:00:12 d #3 FileSystem.watchWithFilter / Disposing watch stream / filter: FileName, LastWrite 00:00:14 d #4 FileSystem.testEventsRaw / eventsLog: 0 / 638664717671248142 / Created ("file1.txt", ...11111111111111111111111111111111111111111111111a") 2705 / 638664717671250847 / Changed ("file1.txt"...11111111111111111111111111111111111111111111111a") 247 / 638664717671251094 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 397 / 638664717671251491 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 295 / 638664717671251786 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 259 / 638664717671252045 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 76 / 638664717671252121 / Changed ("file1.txt", ...11111111111111111111111111111111111111111111111a") 258 / 638664717671252379 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 73 / 638664717671252452 / Changed ("file1.txt", ...11111111111111111111111111111111111111111111111a") 353 / 638664717671252805 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 224 / 638664717671253029 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 87 / 638664717671253116 / Changed ("file1.txt", ...11111111111111111111111111111111111111111111111a") 369 / 638664717671253485 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 74 / 638664717671253559 / Changed ("file1.txt", ...11111111111111111111111111111111111111111111111a") 203 / 638664717671253762 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 105 / 638664717671253867 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 170 / 638664717671254037 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 432 / 638664717671254469 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 134 / 638664717671254603 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 83 / 638664717671254686 / Changed ("file1.txt", ...11111111111111111111111111111111111111111111111a") 176 / 638664717671254862 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 163 / 638664717671255025 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 216 / 638664717671255241 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 57 / 638664717671255298 / Changed ("file1.txt", ...11111111111111111111111111111111111111111111111a") 242 / 638664717671255540 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 68 / 638664717671255608 / Changed ("file1.txt", ...11111111111111111111111111111111111111111111111a") 207 / 638664717671255815 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 163 / 638664717671255978 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 153 / 638664717671256131 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 159 / 638664717671256290 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 170 / 638664717671256460 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 162 / 638664717671256622 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 517 / 638664717671257139 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 187 / 638664717671257326 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 212 / 638664717671257538 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 53 / 638664717671257591 / Changed ("file1.txt", ...11111111111111111111111111111111111111111111111a") 193 / 638664717671257784 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 283 / 638664717671258067 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 201 / 638664717671258268 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 52 / 638664717671258320 / Changed ("file1.txt", ...11111111111111111111111111111111111111111111111a") 292 / 638664717671258612 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 57 / 638664717671258669 / Changed ("file1.txt", ...11111111111111111111111111111111111111111111111a") 236 / 638664717671258905 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 48 / 638664717671258953 / Changed ("file1.txt", ...11111111111111111111111111111111111111111111111a") 178 / 638664717671259131 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 149 / 638664717671259280 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 201 / 638664717671259481 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 45 / 638664717671259526 / Changed ("file1.txt", ...11111111111111111111111111111111111111111111111a") 260 / 638664717671259786 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 56 / 638664717671259842 / Changed ("file1.txt", ...11111111111111111111111111111111111111111111111a") 193 / 638664717671260035 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 229 / 638664717671260264 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 49 / 638664717671260313 / Changed ("file1.txt", ...11111111111111111111111111111111111111111111111a") 255 / 638664717671260568 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 54 / 638664717671260622 / Changed ("file1.txt", ...11111111111111111111111111111111111111111111111a") 172 / 638664717671260794 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 148 / 638664717671260942 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 227 / 638664717671261169 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 55 / 638664717671261224 / Changed ("file1.txt", ...11111111111111111111111111111111111111111111111a") 210 / 638664717671261434 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 74 / 638664717671261508 / Changed ("file1.txt", ...11111111111111111111111111111111111111111111111a") 155 / 638664717671261663 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 285 / 638664717671261948 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 191 / 638664717671262139 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 152 / 638664717671262291 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 235 / 638664717671262526 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 62 / 638664717671262588 / Changed ("file1.txt", ...11111111111111111111111111111111111111111111111a") 190 / 638664717671262778 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 56 / 638664717671262834 / Changed ("file1.txt", ...11111111111111111111111111111111111111111111111a") 234 / 638664717671263068 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 68 / 638664717671263136 / Changed ("file1.txt", ...11111111111111111111111111111111111111111111111a") 293 / 638664717671263429 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 67 / 638664717671263496 / Changed ("file1.txt", ...11111111111111111111111111111111111111111111111a") 145 / 638664717671263641 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 174 / 638664717671263815 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 69 / 638664717671263884 / Changed ("file1.txt", ...11111111111111111111111111111111111111111111111a") 281 / 638664717671264165 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 69 / 638664717671264234 / Changed ("file1.txt", ...11111111111111111111111111111111111111111111111a") 152 / 638664717671264386 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 167 / 638664717671264553 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 148 / 638664717671264701 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 136 / 638664717671264837 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 149 / 638664717671264986 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 147 / 638664717671265133 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 224 / 638664717671265357 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 68 / 638664717671265425 / Changed ("file1.txt", ...11111111111111111111111111111111111111111111111a") 247 / 638664717671265672 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 65 / 638664717671265737 / Changed ("file1.txt", ...11111111111111111111111111111111111111111111111a") 256 / 638664717671265993 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111a") 74 / 638664717671266067 / Changed ("file1.txt", ...11111111111111111111111111111111111111111111111a") 14836 / 638664717671280903 / Created ("file2.txt...22222222222222222222222222222222222222222222222a") 168 / 638664717671281071 / Changed ("file2.txt",...22222222222222222222222222222222222222222222222a") 364 / 638664717671281435 / Changed ("file2.txt",...22222222222222222222222222222222222222222222222a") 1281 / 638664717671282716 / Changed ("file2.txt"...22222222222222222222222222222222222222222222222a") 75 / 638664717671282791 / Changed ("file2.txt", ...22222222222222222222222222222222222222222222222a") 53 / 638664717671282844 / Changed ("file2.txt", ...22222222222222222222222222222222222222222222222a") 479 / 638664717671283323 / Changed ("file2.txt",...22222222222222222222222222222222222222222222222a") 81 / 638664717671283404 / Changed ("file2.txt", ...22222222222222222222222222222222222222222222222a") 60 / 638664717671283464 / Changed ("file2.txt", ...22222222222222222222222222222222222222222222222a") 50587 / 638664717671334051 / Changed ("file2.txt...22222222222222222222222222222222222222222222222a") 15005959 / 638664717686340010 / Changed ("file1....11111111111111111111111111111111111111111111111b") 1754 / 638664717686341764 / Changed ("file1.txt"...11111111111111111111111111111111111111111111111b") 156 / 638664717686341920 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 54 / 638664717686341974 / Changed ("file1.txt", ...11111111111111111111111111111111111111111111111b") 561 / 638664717686342535 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 93 / 638664717686342628 / Changed ("file1.txt", ...11111111111111111111111111111111111111111111111b") 481 / 638664717686343109 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 670 / 638664717686343779 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 282 / 638664717686344061 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 474 / 638664717686344535 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 1080 / 638664717686345615 / Changed ("file1.txt"...11111111111111111111111111111111111111111111111b") 89 / 638664717686345704 / Changed ("file1.txt", ...11111111111111111111111111111111111111111111111b") 164 / 638664717686345868 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 161 / 638664717686346029 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 147 / 638664717686346176 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 213 / 638664717686346389 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 144 / 638664717686346533 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 181 / 638664717686346714 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 164 / 638664717686346878 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 165 / 638664717686347043 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 168 / 638664717686347211 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 160 / 638664717686347371 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 194 / 638664717686347565 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 560 / 638664717686348125 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 220 / 638664717686348345 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 214 / 638664717686348559 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 224 / 638664717686348783 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 245 / 638664717686349028 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 2091 / 638664717686351119 / Changed ("file1.txt"...11111111111111111111111111111111111111111111111b") 156 / 638664717686351275 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 53 / 638664717686351328 / Changed ("file1.txt", ...11111111111111111111111111111111111111111111111b") 171 / 638664717686351499 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 182 / 638664717686351681 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 161 / 638664717686351842 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 189 / 638664717686352031 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 139 / 638664717686352170 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 170 / 638664717686352340 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 177 / 638664717686352517 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 219 / 638664717686352736 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 144 / 638664717686352880 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 167 / 638664717686353047 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 244 / 638664717686353291 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 181 / 638664717686353472 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 151 / 638664717686353623 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 189 / 638664717686353812 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 140 / 638664717686353952 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 172 / 638664717686354124 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 184 / 638664717686354308 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 172 / 638664717686354480 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 172 / 638664717686354652 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 177 / 638664717686354829 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 169 / 638664717686354998 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 165 / 638664717686355163 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 168 / 638664717686355331 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 171 / 638664717686355502 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 190 / 638664717686355692 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 161 / 638664717686355853 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 165 / 638664717686356018 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 159 / 638664717686356177 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 166 / 638664717686356343 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 169 / 638664717686356512 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 182 / 638664717686356694 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 197 / 638664717686356891 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 146 / 638664717686357037 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 191 / 638664717686357228 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 137 / 638664717686357365 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 179 / 638664717686357544 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 908 / 638664717686358452 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 96 / 638664717686358548 / Changed ("file1.txt", ...11111111111111111111111111111111111111111111111b") 233 / 638664717686358781 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 328 / 638664717686359109 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 244 / 638664717686359353 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 255 / 638664717686359608 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 241 / 638664717686359849 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 331 / 638664717686360180 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 381 / 638664717686360561 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 361 / 638664717686360922 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 518 / 638664717686361440 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 254 / 638664717686361694 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 464 / 638664717686362158 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 66 / 638664717686362224 / Changed ("file1.txt", ...11111111111111111111111111111111111111111111111b") 220 / 638664717686362444 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 175 / 638664717686362619 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 207 / 638664717686362826 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 290 / 638664717686363116 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 229 / 638664717686363345 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 198 / 638664717686363543 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 197 / 638664717686363740 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 206 / 638664717686363946 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 203 / 638664717686364149 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 238 / 638664717686364387 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 227 / 638664717686364614 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 196 / 638664717686364810 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 204 / 638664717686365014 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 205 / 638664717686365219 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 190 / 638664717686365409 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 288 / 638664717686365697 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 351 / 638664717686366048 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 152 / 638664717686366200 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 165 / 638664717686366365 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 170 / 638664717686366535 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 163 / 638664717686366698 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 175 / 638664717686366873 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 131 / 638664717686367004 / Changed ("file1.txt",...11111111111111111111111111111111111111111111111b") 21073 / 638664717686388077 / Changed ("file2.txt...22222222222222222222222222222222222222222222222b") 199 / 638664717686388276 / Changed ("file2.txt",...22222222222222222222222222222222222222222222222b") 373 / 638664717686388649 / Changed ("file2.txt",...22222222222222222222222222222222222222222222222b") 331 / 638664717686388980 / Changed ("file2.txt",...22222222222222222222222222222222222222222222222b") 234 / 638664717686389214 / Changed ("file2.txt",...22222222222222222222222222222222222222222222222b") 169 / 638664717686389383 / Changed ("file2.txt",...22222222222222222222222222222222222222222222222b") 194 / 638664717686389577 / Changed ("file2.txt",...22222222222222222222222222222222222222222222222b") 193 / 638664717686389770 / Changed ("file2.txt",...22222222222222222222222222222222222222222222222b") 186 / 638664717686389956 / Changed ("file2.txt",...22222222222222222222222222222222222222222222222b") 173 / 638664717686390129 / Changed ("file2.txt",...22222222222222222222222222222222222222222222222b") 166 / 638664717686390295 / Changed ("file2.txt",...22222222222222222222222222222222222222222222222b") 174 / 638664717686390469 / Changed ("file2.txt",...22222222222222222222222222222222222222222222222b") 153 / 638664717686390622 / Changed ("file2.txt",...22222222222222222222222222222222222222222222222b") 200 / 638664717686390822 / Changed ("file2.txt",...22222222222222222222222222222222222222222222222b") 158 / 638664717686390980 / Changed ("file2.txt",...22222222222222222222222222222222222222222222222b") 163 / 638664717686391143 / Changed ("file2.txt",...22222222222222222222222222222222222222222222222b") 161 / 638664717686391304 / Changed ("file2.txt",...22222222222222222222222222222222222222222222222b") 164 / 638664717686391468 / Changed ("file2.txt",...22222222222222222222222222222222222222222222222b") 170 / 638664717686391638 / Changed ("file2.txt",...22222222222222222222222222222222222222222222222b") 191 / 638664717686391829 / Changed ("file2.txt",...22222222222222222222222222222222222222222222222b") 178 / 638664717686392007 / Changed ("file2.txt",...22222222222222222222222222222222222222222222222b") 190 / 638664717686392197 / Changed ("file2.txt",...22222222222222222222222222222222222222222222222b") 168 / 638664717686392365 / Changed ("file2.txt",...22222222222222222222222222222222222222222222222b") 167 / 638664717686392532 / Changed ("file2.txt",...22222222222222222222222222222222222222222222222b") 167 / 638664717686392699 / Changed ("file2.txt",...22222222222222222222222222222222222222222222222b") 182 / 638664717686392881 / Changed ("file2.txt",...22222222222222222222222222222222222222222222222b") 60911 / 638664717686453792 / Changed ("file2.txt...22222222222222222222222222222222222222222222222b") 307 / 638664717686454099 / Changed ("file2.txt",...22222222222222222222222222222222222222222222222b") 14957401 / 638664717701411500 / Renamed ("file1....1111111111111111111111111111111111111111111111b")) 468 / 638664717701411968 / Renamed ("file2.txt",...2222222222222222222222222222222222222222222222b")) 15073217 / 638664717716485185 / Changed ("file_1...11111111111111111111111111111111111111111111111c") 447 / 638664717716485632 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 1026 / 638664717716486658 / Changed ("file_1.txt...11111111111111111111111111111111111111111111111c") 609 / 638664717716487267 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 111 / 638664717716487378 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 247 / 638664717716487625 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 235 / 638664717716487860 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 220 / 638664717716488080 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 261 / 638664717716488341 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 510 / 638664717716488851 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 148 / 638664717716488999 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 466 / 638664717716489465 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 515 / 638664717716489980 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 275 / 638664717716490255 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 396 / 638664717716490651 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 318 / 638664717716490969 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 252 / 638664717716491221 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 287 / 638664717716491508 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 244 / 638664717716491752 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 259 / 638664717716492011 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 261 / 638664717716492272 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 243 / 638664717716492515 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 237 / 638664717716492752 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 255 / 638664717716493007 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 288 / 638664717716493295 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 410 / 638664717716493705 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 313 / 638664717716494018 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 159 / 638664717716494177 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 1043 / 638664717716495220 / Changed ("file_1.txt...11111111111111111111111111111111111111111111111c") 906 / 638664717716496126 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 396 / 638664717716496522 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 462 / 638664717716496984 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 323 / 638664717716497307 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 255 / 638664717716497562 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 273 / 638664717716497835 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 308 / 638664717716498143 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 551 / 638664717716498694 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 235 / 638664717716498929 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 308 / 638664717716499237 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 242 / 638664717716499479 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 281 / 638664717716499760 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 263 / 638664717716500023 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 208 / 638664717716500231 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 238 / 638664717716500469 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 186 / 638664717716500655 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 169 / 638664717716500824 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 217 / 638664717716501041 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 301 / 638664717716501342 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 221 / 638664717716501563 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 204 / 638664717716501767 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 210 / 638664717716501977 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 199 / 638664717716502176 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 197 / 638664717716502373 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 204 / 638664717716502577 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 224 / 638664717716502801 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 199 / 638664717716503000 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 206 / 638664717716503206 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 196 / 638664717716503402 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 292 / 638664717716503694 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 398 / 638664717716504092 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 294 / 638664717716504386 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 344 / 638664717716504730 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 479 / 638664717716505209 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 106 / 638664717716505315 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 181 / 638664717716505496 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 417 / 638664717716505913 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 704 / 638664717716506617 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 196 / 638664717716506813 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 224 / 638664717716507037 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 214 / 638664717716507251 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 172 / 638664717716507423 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 167 / 638664717716507590 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 184 / 638664717716507774 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 198 / 638664717716507972 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 324 / 638664717716508296 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 313 / 638664717716508609 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 257 / 638664717716508866 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 245 / 638664717716509111 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 248 / 638664717716509359 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 455 / 638664717716509814 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 203 / 638664717716510017 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 503 / 638664717716510520 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 204 / 638664717716510724 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 205 / 638664717716510929 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 275 / 638664717716511204 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 305 / 638664717716511509 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 256 / 638664717716511765 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 201 / 638664717716511966 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 206 / 638664717716512172 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 214 / 638664717716512386 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 195 / 638664717716512581 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 208 / 638664717716512789 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 204 / 638664717716512993 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 218 / 638664717716513211 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 215 / 638664717716513426 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 198 / 638664717716513624 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 219 / 638664717716513843 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 204 / 638664717716514047 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 293 / 638664717716514340 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 245 / 638664717716514585 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 460 / 638664717716515045 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 215 / 638664717716515260 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 210 / 638664717716515470 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 219 / 638664717716515689 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 205 / 638664717716515894 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 205 / 638664717716516099 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 205 / 638664717716516304 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 191 / 638664717716516495 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 211 / 638664717716516706 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 195 / 638664717716516901 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 196 / 638664717716517097 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 217 / 638664717716517314 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 205 / 638664717716517519 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 208 / 638664717716517727 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 220 / 638664717716517947 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 194 / 638664717716518141 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 203 / 638664717716518344 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 199 / 638664717716518543 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 223 / 638664717716518766 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 198 / 638664717716518964 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 352 / 638664717716519316 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 114 / 638664717716519430 / Changed ("file_1.txt"...11111111111111111111111111111111111111111111111c") 36991 / 638664717716556421 / Changed ("file_1.tx...11111111111111111111111111111111111111111111111c") 18609 / 638664717716575030 / Changed ("file_2.tx...22222222222222222222222222222222222222222222222c") 587 / 638664717716575617 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 862 / 638664717716576479 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 658 / 638664717716577137 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 375 / 638664717716577512 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 296 / 638664717716577808 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 279 / 638664717716578087 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 283 / 638664717716578370 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 300 / 638664717716578670 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 312 / 638664717716578982 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 289 / 638664717716579271 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 282 / 638664717716579553 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 279 / 638664717716579832 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 279 / 638664717716580111 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 282 / 638664717716580393 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 308 / 638664717716580701 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 320 / 638664717716581021 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 293 / 638664717716581314 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 295 / 638664717716581609 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 290 / 638664717716581899 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 284 / 638664717716582183 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 288 / 638664717716582471 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 275 / 638664717716582746 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 304 / 638664717716583050 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 315 / 638664717716583365 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 351 / 638664717716583716 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 373 / 638664717716584089 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 331 / 638664717716584420 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 336 / 638664717716584756 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 334 / 638664717716585090 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 339 / 638664717716585429 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 360 / 638664717716585789 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 329 / 638664717716586118 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 322 / 638664717716586440 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 348 / 638664717716586788 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 340 / 638664717716587128 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 338 / 638664717716587466 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 328 / 638664717716587794 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 343 / 638664717716588137 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 350 / 638664717716588487 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 329 / 638664717716588816 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 346 / 638664717716589162 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 331 / 638664717716589493 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 331 / 638664717716589824 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 331 / 638664717716590155 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 502 / 638664717716590657 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 119 / 638664717716590776 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 189 / 638664717716590965 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 176 / 638664717716591141 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 383 / 638664717716591524 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 339 / 638664717716591863 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 336 / 638664717716592199 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 446 / 638664717716592645 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 347 / 638664717716592992 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 353 / 638664717716593345 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 328 / 638664717716593673 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 339 / 638664717716594012 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 327 / 638664717716594339 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 329 / 638664717716594668 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 328 / 638664717716594996 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 349 / 638664717716595345 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 364 / 638664717716595709 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 325 / 638664717716596034 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 323 / 638664717716596357 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 345 / 638664717716596702 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 324 / 638664717716597026 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 348 / 638664717716597374 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 348 / 638664717716597722 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 299 / 638664717716598021 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 323 / 638664717716598344 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 285 / 638664717716598629 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 286 / 638664717716598915 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 285 / 638664717716599200 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 283 / 638664717716599483 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 281 / 638664717716599764 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 298 / 638664717716600062 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 336 / 638664717716600398 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 284 / 638664717716600682 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 292 / 638664717716600974 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 288 / 638664717716601262 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 295 / 638664717716601557 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 284 / 638664717716601841 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 298 / 638664717716602139 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 291 / 638664717716602430 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 337 / 638664717716602767 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 291 / 638664717716603058 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 292 / 638664717716603350 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 280 / 638664717716603630 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 291 / 638664717716603921 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 279 / 638664717716604200 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 306 / 638664717716604506 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 311 / 638664717716604817 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 288 / 638664717716605105 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 279 / 638664717716605384 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 287 / 638664717716605671 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 294 / 638664717716605965 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 281 / 638664717716606246 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 294 / 638664717716606540 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 302 / 638664717716606842 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 314 / 638664717716607156 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 288 / 638664717716607444 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 285 / 638664717716607729 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 285 / 638664717716608014 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 284 / 638664717716608298 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 281 / 638664717716608579 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 314 / 638664717716608893 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 312 / 638664717716609205 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 285 / 638664717716609490 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 287 / 638664717716609777 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 284 / 638664717716610061 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 309 / 638664717716610370 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 425 / 638664717716610795 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 365 / 638664717716611160 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 343 / 638664717716611503 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 370 / 638664717716611873 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 340 / 638664717716612213 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 340 / 638664717716612553 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 348 / 638664717716612901 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 348 / 638664717716613249 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 337 / 638664717716613586 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 363 / 638664717716613949 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 389 / 638664717716614338 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 377 / 638664717716614715 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 366 / 638664717716615081 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 312 / 638664717716615393 / Changed ("file_2.txt"...22222222222222222222222222222222222222222222222c") 15035393 / 638664717731650786 / Deleted "file_1.txt" 2528 / 638664717731653314 / Deleted "file_2.txt" [Created ("file1.txt", Some "1a"); Changed ("file1.txt", Some "1a"); Created ("file2.txt", Some "2a"); Changed ("file2.txt", Some "2a"); Changed ("file1.txt", Some "1b"); Changed ("file2.txt", Some "2b"); Renamed ("file1.txt", ("file_1.txt", Some "1b")); Renamed ("file2.txt", ("file_2.txt", Some "2b")); Changed ("file_1.txt", Some "1c"); Changed ("file_2.txt", Some "2c"); Deleted "file_1.txt"; Deleted "file_2.txt"] Some ()
testEventsSorted (test)¶
In [ ]:
//// test
let inline sortEvent event =
match event with
| FileSystemChange.Failure _ -> 0
| FileSystemChange.Created _ -> 1
| FileSystemChange.Changed _ -> 2
| FileSystemChange.Renamed (_oldPath, _) -> 3
| FileSystemChange.Deleted _ -> 4
let inline formatEvents events =
events
|> Seq.toList
|> List.sortBy (snd >> sortEvent)
|> List.choose (fun (ticks, event) ->
match event with
| FileSystemChange.Failure _ ->
None
| FileSystemChange.Changed (path, _) ->
Some (ticks, System.IO.Path.GetFileName path, nameof FileSystemChangeType.Changed)
| FileSystemChange.Created (path, _) ->
Some (ticks, System.IO.Path.GetFileName path, nameof FileSystemChangeType.Created)
| FileSystemChange.Deleted path ->
Some (ticks, System.IO.Path.GetFileName path, nameof FileSystemChangeType.Deleted)
| FileSystemChange.Renamed (_oldPath, (path, _)) ->
Some (ticks, System.IO.Path.GetFileName path, nameof FileSystemChangeType.Renamed)
)
|> List.sortBy (fun (_, path, _) -> path)
|> List.distinctBy (fun (_, path, event) -> path, event)
let inline testEventsSorted
(watchFn : string -> FSharp.Control.AsyncSeq<int64 * FileSystemChange> * IDisposable)
write
=
let struct (tempDir, tempDisposable) =
"FileSystem.testEventsSorted"
|> SpiralCrypto.hash_text
|> SpiralFileSystem.create_temp_dir'
let stream, disposable = watchFn tempDir
let events = System.Collections.Concurrent.ConcurrentBag ()
let inline iter () =
stream
|> FSharp.Control.AsyncSeq.iterAsyncParallel (fun event -> async { events.Add event })
let run = async {
let! _ = iter () |> Async.StartChild
do! Async.Sleep 250
return! write tempDir
}
try
run
|> Async.runWithTimeout 5000
|> _assertEqual (Some ())
finally
disposable.Dispose ()
tempDisposable.Dispose ()
let events = formatEvents events
let eventMap =
events
|> List.map (fun (ticks, path, event) -> path, (event, ticks))
|> List.groupBy fst
|> List.map (fun (path, events) ->
let event, _ticks =
events
|> List.map snd
|> List.sortByDescending snd
|> List.head
path, event
)
|> Map.ofList
let eventList =
events
|> List.map (fun (_ticks, path, event) -> path, event)
eventMap, eventList
create and delete (test)¶
In [ ]:
//// test
let inline write path = async {
let n = 3
for i = 1 to n do
do! $"{i}" |> SpiralFileSystem.write_all_text_async (path </> $"file{i}.txt")
for i = 1 to n do
do! SpiralFileSystem.delete_file_async (path </> $"file{i}.txt") |> Async.Ignore
do! Async.Sleep 150
}
let inline run () =
let eventMap, eventList = testEventsSorted (watchDirectory (fun _ -> false)) write
[
"file1.txt", nameof FileSystemChangeType.Created
"file1.txt", nameof FileSystemChangeType.Changed
"file1.txt", nameof FileSystemChangeType.Deleted
"file2.txt", nameof FileSystemChangeType.Created
"file2.txt", nameof FileSystemChangeType.Changed
"file2.txt", nameof FileSystemChangeType.Deleted
"file3.txt", nameof FileSystemChangeType.Created
"file3.txt", nameof FileSystemChangeType.Changed
"file3.txt", nameof FileSystemChangeType.Deleted
]
|> _sequenceEqual eventList
[
"file1.txt", nameof FileSystemChangeType.Deleted
"file2.txt", nameof FileSystemChangeType.Deleted
"file3.txt", nameof FileSystemChangeType.Deleted
]
|> Map.ofList
|> _sequenceEqual eventMap
run
|> retry_fn 3
|> _assertEqual (Some ())
Some ()
00:00:16 d #5 FileSystem.watchWithFilter / Disposing watch stream / filter: FileName, LastWrite
[("file1.txt", "Created"); ("file1.txt", "Changed"); ("file1.txt", "Deleted"); ("file2.txt", "Created");
("file2.txt", "Changed"); ("file2.txt", "Deleted"); ("file3.txt", "Created"); ("file3.txt", "Changed");
("file3.txt", "Deleted")]
map [("file1.txt", "Deleted"); ("file2.txt", "Deleted"); ("file3.txt", "Deleted")]
Some ()
change (test)¶
In [ ]:
//// test
let inline write path = async {
let n = 2
for i = 1 to n do
do! $"{i}" |> SpiralFileSystem.write_all_text_async (path </> $"file{i}.txt")
for i = 1 to n do
do! "" |> SpiralFileSystem.write_all_text_async (path </> $"file{i}.txt")
for i = 1 to n do
do! SpiralFileSystem.delete_file_async (path </> $"file{i}.txt") |> Async.Ignore
do! Async.Sleep 150
}
let inline run () =
let eventMap, eventList = testEventsSorted (watchDirectory (fun _ -> false)) write
[
"file1.txt", nameof FileSystemChangeType.Created
"file1.txt", nameof FileSystemChangeType.Changed
"file1.txt", nameof FileSystemChangeType.Deleted
"file2.txt", nameof FileSystemChangeType.Created
"file2.txt", nameof FileSystemChangeType.Changed
"file2.txt", nameof FileSystemChangeType.Deleted
]
|> _sequenceEqual eventList
[
"file1.txt", nameof FileSystemChangeType.Deleted
"file2.txt", nameof FileSystemChangeType.Deleted
]
|> Map.ofList
|> _sequenceEqual eventMap
run
|> retry_fn 3
|> _assertEqual (Some ())
Some ()
00:00:17 d #6 FileSystem.watchWithFilter / Disposing watch stream / filter: FileName, LastWrite
[("file1.txt", "Created"); ("file1.txt", "Changed"); ("file1.txt", "Deleted"); ("file2.txt", "Created");
("file2.txt", "Changed"); ("file2.txt", "Deleted")]
map [("file1.txt", "Deleted"); ("file2.txt", "Deleted")]
Some ()
rename (test)¶
In [ ]:
//// test
let inline write path = async {
let n = 2
for i = 1 to n do
do! $"{i}" |> SpiralFileSystem.write_all_text_async (path </> $"file{i}.txt")
for i = 1 to n do
do! path </> $"file{i}.txt" |> SpiralFileSystem.move_file_async (path </> $"file_{i}.txt") |> Async.Ignore
for i = 1 to n do
do! SpiralFileSystem.delete_file_async (path </> $"file_{i}.txt") |> Async.Ignore
do! Async.Sleep 150
}
let inline run () =
let eventMap, eventList = testEventsSorted (watchDirectory (fun _ -> false)) write
[
"file1.txt", nameof FileSystemChangeType.Created
"file1.txt", nameof FileSystemChangeType.Changed
"file2.txt", nameof FileSystemChangeType.Created
"file2.txt", nameof FileSystemChangeType.Changed
"file_1.txt", nameof FileSystemChangeType.Renamed
"file_1.txt", nameof FileSystemChangeType.Deleted
"file_2.txt", nameof FileSystemChangeType.Renamed
"file_2.txt", nameof FileSystemChangeType.Deleted
]
|> _sequenceEqual eventList
[
"file1.txt", nameof FileSystemChangeType.Changed
"file2.txt", nameof FileSystemChangeType.Changed
"file_1.txt", nameof FileSystemChangeType.Deleted
"file_2.txt", nameof FileSystemChangeType.Deleted
]
|> Map.ofList
|> _sequenceEqual eventMap
run
|> retry_fn 3
|> _assertEqual (Some ())
Some ()
00:00:18 d #7 FileSystem.watchWithFilter / Disposing watch stream / filter: FileName, LastWrite
[("file1.txt", "Created"); ("file1.txt", "Changed"); ("file2.txt", "Created"); ("file2.txt", "Changed");
("file_1.txt", "Renamed"); ("file_1.txt", "Deleted"); ("file_2.txt", "Renamed"); ("file_2.txt", "Deleted")]
map [("file1.txt", "Changed"); ("file2.txt", "Changed"); ("file_1.txt", "Deleted"); ("file_2.txt", "Deleted")]
Some ()
full (test)¶
In [ ]:
//// test
let inline write path = async {
let n = 2
for i = 1 to n do
do! $"{i}" |> SpiralFileSystem.write_all_text_async (path </> $"file{i}.txt")
for i = 1 to n do
do! "" |> SpiralFileSystem.write_all_text_async (path </> $"file{i}.txt")
for i = 1 to n do
do! path </> $"file{i}.txt" |> SpiralFileSystem.move_file_async (path </> $"file_{i}.txt") |> Async.Ignore
for i = 1 to n do
do! $"{i}" |> SpiralFileSystem.write_all_text_async (path </> $"file_{i}.txt")
for i = 1 to n do
do! SpiralFileSystem.delete_file_async (path </> $"file_{i}.txt") |> Async.Ignore
do! Async.Sleep 150
}
let inline run () =
let eventMap, eventList = testEventsSorted (watchDirectory (fun _ -> false)) write
[
"file1.txt", nameof FileSystemChangeType.Created
"file1.txt", nameof FileSystemChangeType.Changed
"file2.txt", nameof FileSystemChangeType.Created
"file2.txt", nameof FileSystemChangeType.Changed
"file_1.txt", nameof FileSystemChangeType.Changed
"file_1.txt", nameof FileSystemChangeType.Renamed
"file_1.txt", nameof FileSystemChangeType.Deleted
"file_2.txt", nameof FileSystemChangeType.Changed
"file_2.txt", nameof FileSystemChangeType.Renamed
"file_2.txt", nameof FileSystemChangeType.Deleted
]
|> _sequenceEqual eventList
[
"file1.txt", nameof FileSystemChangeType.Changed
"file2.txt", nameof FileSystemChangeType.Changed
"file_1.txt", nameof FileSystemChangeType.Deleted
"file_2.txt", nameof FileSystemChangeType.Deleted
]
|> Map.ofList
|> _sequenceEqual eventMap
run
|> retry_fn 3
|> _assertEqual (Some ())
Some ()
00:00:19 d #8 FileSystem.watchWithFilter / Disposing watch stream / filter: FileName, LastWrite
[("file1.txt", "Created"); ("file1.txt", "Changed"); ("file2.txt", "Created"); ("file2.txt", "Changed");
("file_1.txt", "Changed"); ("file_1.txt", "Renamed"); ("file_1.txt", "Deleted"); ("file_2.txt", "Changed");
("file_2.txt", "Renamed"); ("file_2.txt", "Deleted")]
map [("file1.txt", "Changed"); ("file2.txt", "Changed"); ("file_1.txt", "Deleted"); ("file_2.txt", "Deleted")]
Some ()