úÎF—B >      !"#$%&'()*+,-./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>?@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 (.>)     2Modify a record element and return its old value. 2Modify a record element and return its new value. Infix variant of . Infix variant of .    *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. D    !&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. !"#$%!"#$%!"#$%&'()*+,-./0123&'()*+,-./01231/0-.+,)*&'(23&'('()**+,,-../00123 EExample of using set, get, modify. FGHIJKLMNOPQRSModify a value of the T function. U&Modify a value of a curried function. VWXEFGHIJKLMNOPQRSUVWXEFGHIJKLMNOPQRSUVWX 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.  get method  set method 6AGet a value from a record field that is specified by an Accessor record field record "value of the field in the record 7?Set a value of a record field that is specified by an Accessor record field f value x to be set original record new record with field f changed to x 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.  456789:;<=4576 ;<:=89 456789:;<=Y     !"#$%&'()*+,--./01234567&89:;<=>?@ABCDECDFG H I J K L M N O P Q R S   CTU V ! " #Wdata-accessor-0.2.1.2Data.Accessor.BasicData.Accessor.MonadStateData.Accessor.ContainerData.Accessor.ShowData.Accessor.TupleData.Accessor.BinaryRead Data.AccessorData.Accessor.PrivateData.Accessor.ExampleT fromSetGetfromLens fromWrapperselfnullresultset^=composeget^.modify^:$%.><. getAndModify modifyAndGet%=%:liftliftTarray mapDefaultmapMaybe intMapDefault intMapMaybefield showsPrecfirstsecondfirst3second3third3Parser runParserByteCompatibletoByte ByteStreamgetWord8 ByteSource readWord8CanyStreamrecordAccessoraccessorgetValsetVal=:getAputAmodAConsdeconsbase Data.MaybeNothingJusttoMaybeplaininit initInfixreadinfix0infix1infix2infix3infix4 showsPairshow0show1GHC.Baseordresult2