úÎ<6äH      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGNone<A handy quasiquoter to work with the multiline file contentsŒStrips the longest common leading spaces segment. All spacey characters are treated equally. The first line is ignored if it's spaces only.:set -XQuasiQuotes:{ putStr [dedent| hello world ! |]:}hello world !HIJKLHIJKLNone +-./0=BHKM File group File ownerAuxiliary data Regular file contents The underlying MDirectory layout description(Regular file with some contents or emptylet layout = file "foo" Symbolic link let layout = symlink "foo" "bar" Directory:{let layout = dir "foo" $ do file "bar" file "baz":}Empty directorylet layout = emptydir "foo"A nested list of directories:{%let layout = dirs ["foo", "bar"] $ do file "qux" file "quux":}"The default (empty) auxiliary dataAn optic into file contentsBinary contentsFlet layout = file "foo" & contents ?~ binary (ByteString.pack [1..10])Plain text contentsClet layout = file "foo" & contents ?~ text (Data.Text.pack "hello")/Contents are the copy of whose of the real file@let layout = file "foo" & contents ?~ copyOf "/home/user/.vimrc"Anything.let layout = file "foo" & contents .~ anything*let layout = file "foo" & user .~ anything "An optic into symbolic link sourcesymlink "foo" "bar" ^? source Just "bar"!5An optic into symbolic link source expected existence1let layout = symlink "foo" "bar" & exists .~ True"!An optic into file auxiliary data#An optic into file owner'let layout = file "foo" & user ?~ uid 0$Set the file owner by uid%Set the file owner by username1let layout = file "foo" & user ?~ username "root"&An optic into file group(let layout = file "foo" & group ?~ gid 0'Set the file group by groupname(Set the file group by groupname4let layout = file "foo" & group ?~ groupname "wheel")An optic into file mode*let layout = file "foo" & mode ?~ 0o100777* An optic into directory contents+@An optic into the directory contents of the particular directory:{1dirs ["foo", "bar", "baz"] (symlink "qux" "quux")8 ^? into "foo".into "bar".into "baz".focus "qux".source:} Just "quux",!An optic into the particular node.‹Equality check does not care about the order the files are listed insofar they are consistent, i.e. different things aren't named the same2  !"#$%&'()*+,-./012,  !"#$%&'()*+,2  210/.- !"#$%&'()*+,$   !"#$%&'()*+,-./012None +-./0HMT 3This type is isomorphic to N but its O instance accumulates errors6!Errors encountered while running F8&Expected/actual file contents mismatch<!Errors encountered while running EC!Pretty print the directory layoutD$Interpret the directory layout as a PE4Check the real directory layout fits the descriptionF3Make the real directory layout from the descriptionG Construct 3 value from the list of errors fromErrors [] Result ()fromErrors "hello"Error ('h' :| "ello")*3456789:;<=>?@ABCQRDSTUEVWFXYZ[\]^G_`abcde3456789:;<=>?@ABCDEFGCD354GE<BA@?>=8;:9F67354678;:9<BA@?>=CQRDSTUEVWFXYZ[\]^G_`abcdeNone +0HJKM6  !#$%&'()+,3456789:;<=>?@ABCDEFG!  !#$%&'()+,f       !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRPSTPUVWXYZ[\]^_`abcdefghijklmnodirectory-layout-0.6.1.1System.Directory.Layout.QQ System.Directory.Layout.Internal#System.Directory.Layout.InterpreterSystem.Directory.LayoutdedentGroup GroupnameGroupIDUserUsernameUserIDAuxContentsCopyOfTextBinaryFEDSLLayoutLunLfilesymlinkdiremptydirdirsdefauxcontentsbinarytextcopyOfanythingsourceexistsauxuseruidusernamegroupgid groupnamemodeinnardsintofocus$fSemigroupLayout $fEqLayout$fIsStringGroup$fIsStringUser$fIsListContents$fIsStringContents ValidationResultError MakeErrorMakeIOExceptionFitContentsError FitBadCopyOf FitBadText FitBadBinaryFitErrorFitIOExceptionFitBadFileModeFitBadOwnerGroupFitBadOwnerUserFitBadLinkSourceFitBadFileContentsprettyspecfitmake fromErrors dropFirststripCommonLeadingWhitespacecommonLeadingWhitespace minimumOrquoterbaseGHC.BaseFunctor Data.EitherEitherControl.Applicative Applicative hspec-1.11.4Test.Hspec.Core.TypeSpecprettyFprettyCspecF examplesCvalidatefitIOfitIOAuxmakeIO makeIOAux getUserID getUsername getGroupID getGroupname fromEither$fApplicativeValidation$fBitraversableValidation$fBifoldableValidation$fBifunctorValidation$fExceptionMakeError$fExceptionFitError$fShowFitError