úÎ BJ=Î>      !"#$%&'()*+,-./0123456789:;<= <The access functions we propose, look very similar to those Lneeded for List.mapAccumL (but parameter order is swapped) and State monad. 3They get the new value of the field and the record Mand return the old value of the field and the record with the updated field. >?@A>?>?@AIf an object is wrapped in a newtype, you can generate an Accessor to the unwrapped data 2by providing a wrapper and an unwrapper function. *The set function is simpler in this case, %since no existing data must be kept. OSince the information content of the wrapped and unwrapped data is equivalent, $you can swap wrapper and unwrapper. This way you can construct an Accessor :that treats a record field containing an unwrapped object *like a field containing a wrapped object.  newtype A = A {unA :: Int}   access :: Accessor.T A Int  access = fromWrapper A unA Access the record itself (Access a (non-existing) element of type () result a/ accesses the value of a function for argument a. &Also see semantic editor combinators, @that allow to modify all function values of a function at once. Cf.  8http://conal.net/blog/posts/semantic-editor-combinators/ Set the value of a field.  as infix operator. This lets us write %first ^= 2+3 $ second ^= 5+7 $ record. This is a general function, Obut it is especially useful for setting many values of different type at once. Get the value of a field.   as infix operator. This lets us write record^.field^.subfield.  This imitates Modula II syntax. /Transform the value of a field by a function.   as infix operator. This lets us write field^:subfield^:(2*) $ record, record$%field^:subfield^:(2*) or "record$%field^:subfield^:(const 1). Flipped version of '($)'. Accessor composition: 5Combine an accessor with an accessor to a sub-field. Speak "stack". *Accessor composition the other direction.  (<.) = flip (.>)    *Treats a finite map like an infinite map, >where all undefined elements are replaced by a default value. *Treats a finite map like an infinite map, !where all undefined elements are B  and defined elements are C . &Access to the first value of a pair. 'Access to the second value of a pair. (Access to the first value of a triple. )Access to the second value of a triple. (Access to the third value of a triple.  !"#$%&'()*(&'$%"# !)* !!"##$%%&''()*.2Modify a record element and return its old value. /2Modify a record element and return its new value. 0Infix variant of +. 1Infix variant of -. +,-./0123 +,-./0123 +,-./0123 DExample of using set, get, modify. EModify a value of the F  function. G&Modify a value of a curried function. DHIJKLMNOPQRSTEGUVWDHIJKLMNOPQRSTEGUVW 4An  Accessor r a" is an object that encodes how to  get and put a subject of type a out of/into an object  of type s. 0In order for an instance of this data structure a to be  an 4#, it must obey the following laws:  getVal a (setVal a x r) = x  setVal a (getVal a r) r = r 5 Construct an 4 from a get and a set method. 6AGet a value from a record field that is specified by an Accessor 7?Set a value of a record field that is specified by an Accessor 8Accessor composition: 5Combine an accessor with an accessor to a sub-field. Speak "stack". 9*Accessor composition the other direction.  (<.) = flip (.>) :An "assignment operator" for state monads.  (=:) = putA ;4A structural dereference function for state monads. <3A structural assignment function for state monads. =5A structural modification function for state monads.  01456789:;<=4576 ;<:0=189 456789:;<=X  !"#$%&'()**+,-./01234#56789:;<=>?@ABCDE F G H  IJ K L M N O P Q R S T U V     Wdata-accessor-0.2.1Data.Accessor.BasicData.Accessor.ContainerData.Accessor.ShowData.Accessor.TupleData.Accessor.BinaryReadData.Accessor.MonadState Data.AccessorData.Accessor.Privatebase Data.MaybeData.Accessor.Example Data.CharT fromSetGetfromLens fromWrapperselfnullresultset^=composeget^.modify^:$%.><.array mapDefaultmapMaybe intMapDefault intMapMaybefield showsPrecfirstsecondfirst3second3third3Parser runParserByteCompatibletoByte ByteStreamgetWord8 ByteSource readWord8CanyStreamrecord getAndModify modifyAndGet%=%:liftliftTAccessoraccessorgetValsetVal=:getAputAmodAConsdeconsNothingJustplainGHC.Baseordresult2init initInfixreadinfix0infix1infix2infix3infix4 showsPairshow0show1