Skip to content

Instantly share code, notes, and snippets.

@morteako
Last active September 16, 2019 21:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save morteako/aa24138ed382c43113bee8ae906bbafd to your computer and use it in GitHub Desktop.
Save morteako/aa24138ed382c43113bee8ae906bbafd to your computer and use it in GitHub Desktop.
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE OverloadedStrings #-}
import Data.Aeson.QQ
import Data.Aeson
import Data.Aeson.Lens
import Control.Lens
obj = [aesonQQ|
{
"a": {"x":1},
"b": {"x":2}
}
|]
--Litt forenklet så lager man den lensen her som går ned i objektene (zoomer):
-- members : går ned i verdiene ( [a,b])
-- _Object : går ned i objektene (ned i {x:1|2}, trengs bare pga haskell datatype)
-- at "y" : går ned i objektet med key y
--når man skal sette noe på en <at>, så er det sånn at hvis man gir Nothing, så slettes det som var der.
--hvis man gir Just val, så settes val inn. Vi skal jo sette inn, så vi gir Just (Number 1), der Number bare er
--en datakonstruktør for at typen skal passe
main = do
print obj
print $ encode obj
let insertVal = Just (Number 1)
let newObj = set (members . _Object . at "y") insertVal obj
print newObj
print $ encode newObj
--Går tilbake til orginalt objekt ved å slette verdeien på y, ved Nothing
let orgObj = set (members . _Object . at "y") Nothing newObj
print orgObj
print $ encode orgObj
--obj
-- Object (fromList [("a",Object (fromList [("x",Number 1.0)])),("b",Object (fromList [("x",Number 2.0)]))])
-- "{\"a\":{\"x\":1},\"b\":{\"x\":2}}"
--newObj
-- Object (fromList [("a",Object (fromList [("x",Number 1.0),("y",Number 1.0)])),("b",Object (fromList [("x",Number 2.0),("y",Number 1.0)]))])
-- "{\"a\":{\"x\":1,\"y\":1},\"b\":{\"x\":2,\"y\":1}}"
--orgObj
-- Object (fromList [("a",Object (fromList [("x",Number 1.0)])),("b",Object (fromList [("x",Number 2.0)]))])
-- "{\"a\":{\"x\":1},\"b\":{\"x\":2}}"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment