I'm seeing a problem when I try to diff a change to a Set Text. I think the issue is that the diff is performed by turning the set into JSON and passing it to Data.Aeson.Diff, which then treats the set like a list, and produces a patch with an index that's too large for the FieldLens instance for Set.
Note that this is case-sensitive; if you switch the roles of "a" and "b" then it succeeds.
I think maybe a valid fix would be for the FieldLens Set instance to accept a key equal to the size of the set?
{-# LANGUAGE DeriveGeneric, TemplateHaskell, OverloadedStrings, QuasiQuotes #-}
import Data.Aeson
import Data.Aeson.Diff
import Data.Aeson.Diff.Generic as ADG
import Data.Set as Set
import Data.String.Interpolate
import Relude
main :: IO ()
main = do
let orig = Set.fromList ["a" :: Text]
let new = Set.fromList ["a", "b" :: Text]
let p = diff (toJSON orig) (toJSON new)
putStrLn [i|Patch: #{p}|]
let result = ADG.patch p orig
putStrLn [i|Result: #{result}|]
Output:
> main
Patch: Patch {patchOperations = [Add {changePointer = Pointer {pointerPath = [AKey 1]}, changeValue = String "b"}]}
Result: Error "Operation Add on /1 failed: Index out of bounds"
I'm seeing a problem when I try to diff a change to a
Set Text. I think the issue is that thediffis performed by turning the set into JSON and passing it toData.Aeson.Diff, which then treats the set like a list, and produces a patch with an index that's too large for theFieldLensinstance forSet.Note that this is case-sensitive; if you switch the roles of "a" and "b" then it succeeds.
I think maybe a valid fix would be for the
FieldLens Setinstance to accept a key equal to the size of the set?{-# LANGUAGE DeriveGeneric, TemplateHaskell, OverloadedStrings, QuasiQuotes #-} import Data.Aeson import Data.Aeson.Diff import Data.Aeson.Diff.Generic as ADG import Data.Set as Set import Data.String.Interpolate import Relude main :: IO () main = do let orig = Set.fromList ["a" :: Text] let new = Set.fromList ["a", "b" :: Text] let p = diff (toJSON orig) (toJSON new) putStrLn [i|Patch: #{p}|] let result = ADG.patch p orig putStrLn [i|Result: #{result}|]Output: