úÎAƒ;òF      !"#$%&'()*+,-./0123456789:;<=>?@ABCDENone<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 !F‘The first line can be safely dropped if it consists only of spaces, but we want to preserve the last newline, thus last line can only be trimmed GHIFJKLMNOP GHIFJKLMNOPNone +-./0=BHKM File group File ownerAuxiliary data Regular file contents The underlying QDirectory 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 +-./0HJKMT RThis type is isomorphic to S but its T instance accumulates errors3!Errors encountered while running C5&Expected/actual file contents mismatch9!Errors encountered while running B@!Pretty print the directory layoutA$Interpret the directory layout as a UB4Check the real directory layout fits the descriptionC3Make the real directory layout from the descriptionDRMake the real directory layout from the description removing any previous contentsE Construct  Validation value from the list of errors fromErrors []Right ()fromErrors NothingRight ()fromErrors "hello"Left ('h' :| "ello")fromErrors (Just "hello")Left ("hello" :| [])+RVW3456789:;<=>?@XYAZ[\]B^_CD`abcdefghEijkl3456789:;<=>?@ABCDE@AEB9?>=<;:5876CD34RWV3458769?>=<;:@XYAZ[\]B^_CD`abcdefghEijklNone +0HJKM4  !#$%&'()+,3456789:;<=>?@ABCDE!  !#$%&'()+,m       !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWTXYTZ[\]^_`abcdefghijklmnopqrstuvdirectory-layout-0.7.1.0System.Directory.Layout.QQ System.Directory.Layout.Internal#System.Directory.Layout.InterpreterSystem.Directory.LayoutdedentGroup GroupnameGroupIDUserUsernameUserIDAuxContentsCopyOfTextBinaryFEDSLLayoutLunLfilesymlinkdiremptydirdirsdefauxcontentsbinarytextcopyOfanythingsourceexistsauxuseruidusernamegroupgid groupnamemodeinnardsintofocus$fSemigroupLayout $fEqLayout$fIsStringGroup$fIsStringUser$fIsListContents$fIsStringContents MakeErrorMakeIOExceptionFitContentsError FitBadCopyOf FitBadText FitBadBinaryFitErrorFitIOExceptionFitBadFileModeFitBadOwnerGroupFitBadOwnerUserFitBadLinkSourceFitBadFileContentsprettyexamplesfitmakeremake fromErrorstrim withLinessplitunsplit dropFirsttrimLaststripstripCommonLeadingWhitespacecommonLeadingWhitespace minimumOrquoterbaseGHC.BaseFunctor\/ Data.EitherEitherControl.Applicative Applicative hspec-1.11.4Test.Hspec.Core.TypeSpecResultErrorprettyFprettyC examplesF examplesCvalidate validateIOfitIOfitIOAuxmakeIO makeIOAux getUserID getUsername getGroupID getGroupname fromEithertoEither validation$fApplicative\/$fExceptionMakeError$fExceptionFitError$fShowFitError