liblawless 0.13.3 → 0.14.0.1
raw patch · 22 files changed
+462/−169 lines, 22 filesdep +boomerangdep +data-defaultdep +dnsdep −pathdep −path-ionew-component:exe:ZFSPVP ok
version bump matches the API change (PVP)
Dependencies added: boomerang, data-default, dns, network, network-ip
Dependencies removed: path, path-io
API changes (from Hackage documentation)
- Aeson: moludeJSONOptions :: Options
- Aeson: moludeParseJSON :: forall a. (GFromJSON (Rep a), Generic a) => Value -> Parser a
- Aeson: moludeToJSONEncoding :: forall a. (GToEncoding (Rep a), Generic a) => a -> Encoding
- Paths: filePath :: Getter (Path b t) FilePath
- Paths: type AbsDir = Path Abs Dir
- Paths: type AbsFile = Path Abs File
- Paths: type RelDir = Path Rel Dir
- Paths: type RelFile = Path Rel File
+ Aeson: lawlessJSONOptions :: Options
+ Aeson: lawlessParseJSON :: forall a. (GFromJSON (Rep a), Generic a) => Value -> Parser a
+ Aeson: lawlessToJSONEncoding :: forall a. (GToEncoding (Rep a), Generic a) => a -> Encoding
+ Boomerang: (∘) :: forall (b :: k) (c :: k) (a :: k) (cat :: k -> k -> *). Category cat => cat b c -> cat a b -> cat a c
+ Boomerang: infix 9 ∘
+ Boomerang: type TextsBoomerang a b = Boomerang TextsError [Text] a b
+ Map: data Map k a :: * -> * -> *
+ Map: singleton :: k -> a -> Map k a
+ Text: nfcText :: (Choice p, Applicative f) => p Text (f Text) -> p NFCText (f NFCText)
+ Text: nfcUtf8 :: (Choice p, Applicative f) => p String (f String) -> p NFCText (f NFCText)
+ Text: nfcUtf8ByteString :: (Choice p, Applicative f) => p ByteString (f ByteString) -> p NFCText (f NFCText)
- Temporary: withTempHandle :: (MonadIO m, MonadMask m) => RelFile -> (Handle -> m a) -> m a
+ Temporary: withTempHandle :: (MonadIO m, MonadMask m) => FilePath -> (Handle -> m a) -> m a
Files
- CHANGELOG +0/−0
- ChangeLog +22/−0
- Examples/ZFS/Main.hs +16/−0
- Examples/ZFS/Types.hs +19/−0
- Examples/ZFS/Types/ZName.hs +59/−0
- Examples/ZFS/Types/ZPool.hs +27/−0
- Examples/ZFS/Types/ZPools.hs +28/−0
- Examples/ZFS/zpools.yaml +18/−0
- README.md +14/−5
- Source/Aeson.hs +9/−9
- Source/Boomerang.hs +24/−0
- Source/Lawless.hs +1/−1
- Source/Map.hs +10/−0
- Source/Networking.hs +14/−0
- Source/Paths.hs +0/−27
- Source/Temporary.hs +3/−3
- Source/Text.hs +17/−4
- Source/Yaml.hs +3/−1
- TODO.org +10/−0
- Tests/TestAeson.hs +6/−6
- Tests/TestTemporary.hs +1/−2
- liblawless.cabal +161/−111
− CHANGELOG
+ ChangeLog view
@@ -0,0 +1,22 @@+2016-12-16 Evan Cofsky <evan@theunixman.com>++ * Examples/ZFS/zpools.yaml: Rename from zpool.yaml.++ * liblawless.cabal: Uncomment ZFS example build.++ * Source/Yaml.hs: Import and export Generics here, too.++ * Examples/ZFS: Create Types, use optics, add Main.hs.++ * Source/Aeson.hs: Rename molude to lawless.++ * Tests/TestAeson.hs: Rename molude to lawless.++ * liblawless.cabal (0.14.0): Adding Networking library, clearing+ up NFC Text, focusing more on examples and tests.++ * Source/Text.hs: Clearer notion of NFC optics vs regular Lens+ optics.++ * Source/Networking.hs: Created this file to start composing+ various network libraries together.
+ Examples/ZFS/Main.hs view
@@ -0,0 +1,16 @@+{-|+Module: Main+Description: Demonstration of Boomerang and Yaml for parsing.+Copyright: © 2016 All rights reserved.+License: GPL-3+Maintainer: Evan Cofsky <>+Stability: experimental+Portability: POSIX+-}++module Main where++import Lawless+import Types++main = putStrLn "Hello"
+ Examples/ZFS/Types.hs view
@@ -0,0 +1,19 @@+{-|+Module: Types+Description: ZFS and ZPool types+Copyright: © 2016 All rights reserved.+License: GPL-3+Maintainer: Evan Cofsky <>+Stability: experimental+Portability: POSIX+-}++module Types (+ module Types.ZPools,+ module Types.ZPool,+ module Types.ZName+ ) where++import Types.ZPools+import Types.ZPool+import Types.ZName
+ Examples/ZFS/Types/ZName.hs view
@@ -0,0 +1,59 @@+{-# LANGUAGE TemplateHaskell #-}+{-|+Module: Types.ZName+Description: Builder for a ZPool name.+Copyright: © 2016 All rights reserved.+License: GPL-3+Maintainer: Evan Cofsky <>+Stability: experimental+Portability: POSIX+-}++module Types.ZName where++import Lawless+import Yaml+import Text++data ZNDateTime = ISO8601 deriving (Show, Eq, Ord, Generic)+makePrisms ''ZNDateTime++instance FromJSON ZNDateTime where+ parseJSON = lawlessParseJSON++instance ToJSON ZNDateTime where+ toEncoding = lawlessToJSONEncoding++data ZNComponent =+ String Text |+ Datetime ZNDateTime+ deriving (Eq, Show, Ord, Generic)+makePrisms ''ZNComponent++instance FromJSON ZNComponent where+ parseJSON = lawlessParseJSON++instance ToJSON ZNComponent where+ toEncoding = lawlessToJSONEncoding++newtype ZNComponents = ZNComponents [ZNComponent]+ deriving (Eq, Show, Ord, Monoid, Generic)+makePrisms ''ZNComponents++instance FromJSON ZNComponents where+ parseJSON = lawlessParseJSON++instance ToJSON ZNComponents where+ toEncoding = lawlessToJSONEncoding++data ZName = ZName {+ _znSeparator ∷ Char,+ _znComponents ∷ ZNComponents+ } deriving (Eq, Show, Ord, Generic)+makePrisms ''ZName++instance FromJSON ZName where+ parseJSON = lawlessParseJSON++instance ToJSON ZName where+ toEncoding = lawlessToJSONEncoding
+ Examples/ZFS/Types/ZPool.hs view
@@ -0,0 +1,27 @@+{-# LANGUAGE TemplateHaskell #-}+{-|+Module: Types.ZPool+Description: Description of a single ZPool+Copyright: © 2016 All rights reserved.+License: GPL-3+Maintainer: Evan Cofsky <>+Stability: experimental+Portability: POSIX+-}++module Types.ZPool where++import Lawless+import Yaml+import Types.ZName++data ZPool = ZPool {+ _zpName ∷ ZName+ } deriving (Eq, Show, Ord, Generic)+makePrisms ''ZPool++instance FromJSON ZPool where+ parseJSON = lawlessParseJSON++instance ToJSON ZPool where+ toEncoding = lawlessToJSONEncoding
+ Examples/ZFS/Types/ZPools.hs view
@@ -0,0 +1,28 @@+{-|+Module: Types.ZPools+Description: Representation of a collection of ZPools+Copyright: © 2016 All rights reserved.+License: GPL-3+Maintainer: Evan Cofsky <>+Stability: experimental+Portability: POSIX+-}++{-# LANGUAGE TemplateHaskell #-}++module Types.ZPools where++import Lawless+import Yaml+import Set+import Types.ZPool++newtype ZPools = ZPools (Set ZPool)+ deriving (Eq, Show, Generic, Monoid)+makePrisms ''ZPools++instance FromJSON ZPools where+ parseJSON = lawlessParseJSON++instance ToJSON ZPools where+ toEncoding = lawlessToJSONEncoding
+ Examples/ZFS/zpools.yaml view
@@ -0,0 +1,18 @@+zpools:+ - name:+ separator: _+ components:+ - string: zpool+ - datetime: iso8601+ options:+ - atime: false+ - compression: lz4+ - normalization: formD+ - mountpount: null+ - acltype: posixacl+ - xattr: sa+ - checksum: sha256+ - devices: false+ - setuid: false+ - exec: off+ - redundant_metadata: all
README.md view
@@ -1,6 +1,7 @@-# Molude, a Prelude Replacement+# Lawless, a Prelude Replacement -Welcome to [Molude, a Prelude Replacement][Molude]. It focuses on a few core ideas:+Welcome to [Lawless, a Prelude Replacement][Lawless]. It focuses on a+few core ideas: - Support for GHC 8 and later - Yaml configuration@@ -9,11 +10,19 @@ - Lenses and default Aeson encodings for generated datastructures. - Easy Generic and Typeable deriving. -It's based on [protolude][protolude], [lenses][lenses], and tries to-extend on them as much as possible.+It's based on [protolude][protolude], [lenses][lenses],+and [machines][machines], and tries to extend on them as much as+possible. -[Molude]: https://gitlab.com/misandrist/libmolude+[Lawless]: https://gitlab.com/misandrist/liblawless [protolude]: https://github.com/sdiehl/protolude [lenses]: https://hackage.haskell.org/package/lens++[machines]: https://hackage.haskell.org/package/machines++# Why Lawless?++1. It was started essentially by a rogue spinoff Haskell community+ that rapidly expanded into its own organization.
Source/Aeson.hs view
@@ -2,9 +2,9 @@ module Data.Aeson, module Data.Aeson.Types, module Data.JsonSchema.Draft4,- moludeJSONOptions,- moludeToJSONEncoding,- moludeParseJSON+ lawlessJSONOptions,+ lawlessToJSONEncoding,+ lawlessParseJSON ) where import Lawless@@ -21,8 +21,8 @@ in toListOf (droppingWhile p folded) -moludeJSONOptions ∷ Options-moludeJSONOptions = defaultOptions {+lawlessJSONOptions ∷ Options+lawlessJSONOptions = defaultOptions { fieldLabelModifier = camelTo2 '_' ∘ dropLensPrefix, constructorTagModifier = camelTo2 '_' ∘ dropLensPrefix, allNullaryToStringTag = False,@@ -30,8 +30,8 @@ unwrapUnaryRecords = True, sumEncoding = ObjectWithSingleField} -moludeToJSONEncoding ∷ ∀ a. (GToEncoding (Rep a), Generic a) ⇒ a → Encoding-moludeToJSONEncoding = genericToEncoding moludeJSONOptions+lawlessToJSONEncoding ∷ ∀ a. (GToEncoding (Rep a), Generic a) ⇒ a → Encoding+lawlessToJSONEncoding = genericToEncoding lawlessJSONOptions -moludeParseJSON ∷ ∀ a. (GFromJSON (Rep a), Generic a) ⇒ Value → Parser a-moludeParseJSON = genericParseJSON moludeJSONOptions+lawlessParseJSON ∷ ∀ a. (GFromJSON (Rep a), Generic a) ⇒ Value → Parser a+lawlessParseJSON = genericParseJSON lawlessJSONOptions
+ Source/Boomerang.hs view
@@ -0,0 +1,24 @@+{-# LANGUAGE TemplateHaskell #-}+{-# Language TypeOperators, PolyKinds, MultiWayIf #-}++module Boomerang (+ module Text.Boomerang,+ module Text.Boomerang.TH,+ module Text.Boomerang.Texts,+ module Control.Category,+ TextsBoomerang,+ (∘)+ ) where++import Text (Text)+import Text.Boomerang+import Text.Boomerang.TH+import Text.Boomerang.Texts+import Control.Category ((.), id, Category)++type TextsBoomerang a b = Boomerang TextsError [Text] a b++(∘) ∷ ∀ (b ∷ k) (c ∷ k) (a ∷ k) (cat ∷ k → k → *).+ Category cat ⇒ cat b c → cat a b → cat a c+(∘) = (.)+infix 9 ∘
Source/Lawless.hs view
@@ -26,7 +26,7 @@ import Functor import List import Monad-import Control.Lens+import Control.Lens hiding (strict) import Data.Eq (Eq(..)) import Data.Ord (Ord(..))
+ Source/Map.hs view
@@ -0,0 +1,10 @@+module Map (+ module Data.Map.Lens,+ module Data.Map.Unicode,+ Map,+ singleton+ ) where++import Data.Map.Lens+import Data.Map.Unicode+import Data.Map (Map, singleton)
+ Source/Networking.hs view
@@ -0,0 +1,14 @@+-- | Network type library++module Networking (+ module Network.IP.Addr,+ module Network.Socket,+ module Network.Socket.ByteString,+ module Network.DNS+ ) where++import Lawless+import Network.IP.Addr+import Network.Socket hiding (send, sendTo, recv, recvFrom)+import Network.Socket.ByteString+import Network.DNS
− Source/Paths.hs
@@ -1,27 +0,0 @@-{-# Language NoMonomorphismRestriction #-}--module Paths- (- module Path,- module Path.IO,- module System.FilePath,- AbsDir,- AbsFile,- RelDir,- RelFile,- filePath- ) where---import Control.Lens (Getter, to)-import Path-import Path.IO-import System.FilePath hiding ((</>), makeRelative)--type AbsDir = Path Abs Dir-type AbsFile = Path Abs File-type RelDir = Path Rel Dir-type RelFile = Path Rel File--filePath ∷ Getter (Path b t) FilePath-filePath = to (toFilePath)
Source/Temporary.hs view
@@ -12,16 +12,16 @@ import Lawless hiding ((<.>)) import qualified System.IO.Temp as T-import Paths import Control.Monad.IO.Class import System.IO import Control.Monad.Catch+import System.FilePath -- | Run a function with a temporary file handle named after the -- passed name. Ensures the handle is unbuffered and in binary mode.-withTempHandle ∷ (MonadIO m, MonadMask m) ⇒ RelFile → (Handle → m a) → m a+withTempHandle ∷ (MonadIO m, MonadMask m) ⇒ FilePath → (Handle → m a) → m a withTempHandle name f =- T.withSystemTempFile (name ^. filePath <> "XXXXXXXXXXXXXXXX")+ T.withSystemTempFile (name <> "XXXXXXXXXXXXXXXX") $ \_ h → -- Make sure the handle is strictly binary with no buffering. liftIO (hSetBuffering h NoBuffering) >>
Source/Text.hs view
@@ -1,10 +1,23 @@+{-# Language NoMonomorphismRestriction #-}+ module Text (- module Data.Text.ICU.Normalized.NFC, module Data.Text,- module Data.Text.Lens+ module Data.Text.Lens,+ nfcText,+ nfcUtf8ByteString,+ nfcUtf8 ) where -import Data.Text.ICU.Normalized.NFC-import Data.Text (Text)+import qualified Data.Text.ICU.Normalized.NFC as NFC+import Data.Text (Text, null, empty) import Data.Text.Lens++-- | Converts between 'Text' and 'NFCText'+nfcText = NFC.strict++-- | Converts between a UTF-8 ByteString and an NFCText+nfcUtf8ByteString = NFC.utf8ByteString++-- | Converts between a String and an NFCText+nfcUtf8 = NFC.utf8
Source/Yaml.hs view
@@ -2,8 +2,10 @@ module Yaml ( module Data.Yaml,- module Aeson+ module Aeson,+ module Generics ) where +import Generics import Data.Yaml import Aeson hiding (decode, encode)
+ TODO.org view
@@ -0,0 +1,10 @@+* What's Next+This file describes the current and proposed changes to liblawless+over the next few release cycles.+* 0.14+** Networking Support+- Adaptors for [[http://hackage.haskell.org/package/network-ip][network-ip]], [[http://hackage.haskell.org/package/dns][DNS]], [[http://hackage.haskell.org/package/network-ip][network]].+** Improved Text Support+- Avoid collisions with [[http://hackage.haskell.org/package/lens-4.15.1/docs/Data-Text-Lens.html][Data.Text.Lens]]+** Boomerang+- Use [[http://hackage.haskell.org/package/boomerang][Boomerang]] as the primary parsing library.
Tests/TestAeson.hs view
@@ -28,9 +28,9 @@ } deriving (Show, Eq, Ord, Generic) makeLenses ''TestData instance ToJSON TestData where- toEncoding = moludeToJSONEncoding+ toEncoding = lawlessToJSONEncoding instance FromJSON TestData where- parseJSON = moludeParseJSON+ parseJSON = lawlessParseJSON instance Arbitrary Text where arbitrary = pack <$> arbitrary@@ -54,9 +54,9 @@ _clRegion ∷ Text } deriving (Show, Eq, Ord, Generic) instance ToJSON Cluster where- toEncoding = moludeToJSONEncoding+ toEncoding = lawlessToJSONEncoding instance FromJSON Cluster where- parseJSON = moludeParseJSON+ parseJSON = lawlessParseJSON data Schema1 = Schema1 {@@ -64,9 +64,9 @@ _sc1Cluster ∷ Cluster } deriving (Show, Eq, Ord, Generic) instance ToJSON Schema1 where- toEncoding = moludeToJSONEncoding+ toEncoding = lawlessToJSONEncoding instance FromJSON Schema1 where- parseJSON = moludeParseJSON+ parseJSON = lawlessParseJSON properties ∷ Test properties = $(testGroupGenerator)
Tests/TestTemporary.hs view
@@ -19,7 +19,6 @@ import Test.Framework.Providers.QuickCheck2 (testProperty) import Test.QuickCheck import Text-import Paths import Temporary import qualified Data.ByteString as B import System.IO hiding (utf8)@@ -31,7 +30,7 @@ prop_CheckBuffering (line ∷ Text) = monadicIO $ do let l = encodeUtf8 line- m ← run $ withTempHandle $(mkRelFile "testTemp") $ \h → do+ m ← run $ withTempHandle "testTemp" $ \h → do B.hPut h l hSeek h AbsoluteSeek 0 B.hGetContents h
liblawless.cabal view
@@ -1,5 +1,5 @@ name: liblawless-version: 0.13.3+version: 0.14.0.1 synopsis: Prelude based on protolude for GHC 8 and beyond. license: GPL-3 license-file: LICENSE@@ -9,96 +9,104 @@ category: Prelude build-type: Simple extra-source-files:- CHANGELOG+ ChangeLog README.md+ TODO.org Tests/*.hs cabal-version: >=1.24+data-files:+ Examples/ZFS/zpools.yaml description: A Prelude relpacement for GHC 8 with a focus on building applications with Lenses, Machines, and Applicatives. source-repository head type: git- location: https://gitlab.com/misandrist/liblawless.git+ location: git+ssh://lambdanow.us/projects/haskellnow/liblawless.git -source-repository this- type: git- location: https://gitlab.com/misandrist/liblawless.git- tag: v0.13.3+-- source-repository this+-- type: git+-- location: location: git+ssh://lambdanow.us/projects/haskellnow/liblawless.git+-- tag: v0.13.1 library exposed-modules:- Aeson- Exception- Generics- Machine- Parser- Paths- Lawless- Set- Temporary- Text- Textual- Textual.SepList- Time- Tree- Yaml+ Aeson+ Boomerang+ Exception+ Generics+ Lawless+ Machine+ Map+ Networking+ Parser+ Set+ Temporary+ Text+ Textual+ Textual.SepList+ Time+ Tree+ Yaml default-extensions:- NoImplicitPrelude- UnicodeSyntax- LambdaCase- ConstraintKinds- DefaultSignatures- FlexibleContexts- FlexibleInstances- FunctionalDependencies- GADTs- DeriveGeneric- DeriveDataTypeable- GeneralizedNewtypeDeriving- KindSignatures- MultiParamTypeClasses- OverloadedStrings- PartialTypeSignatures- RankNTypes- ScopedTypeVariables- StandaloneDeriving- TypeFamilies- TypeSynonymInstances+ NoImplicitPrelude+ UnicodeSyntax+ LambdaCase+ ConstraintKinds+ DefaultSignatures+ FlexibleContexts+ FlexibleInstances+ FunctionalDependencies+ GADTs+ DeriveGeneric+ DeriveDataTypeable+ GeneralizedNewtypeDeriving+ KindSignatures+ MultiParamTypeClasses+ OverloadedStrings+ PartialTypeSignatures+ RankNTypes+ ScopedTypeVariables+ StandaloneDeriving+ TypeFamilies+ TypeSynonymInstances build-depends:- base >=4.9 && <4.10,- aeson >= 0.11.2 && < 0.12,- bytestring >= 0.10.8 && < 0.11,- containers >= 0.5.7 && < 0.6,- binary >= 0.8.3 && < 0.9,- text >= 1.2.2 && < 1.3,- transformers >= 0.5.2 && < 0.6,- mtl >= 2.2.1 && < 2.3,- time >= 1.6.0 && < 1.7,- base-unicode-symbols >= 0.2.2 && < 0.3,- stm >= 2.4.4 && < 2.5,- machines >= 0.6.1 && < 0.7,- contravariant >= 1.4 && < 1.5,- semigroups >= 0.18.2 && < 0.19,- exceptions >= 0.8.3 && < 0.9,- containers-unicode-symbols >= 0.3.1 && < 0.4,- data-textual >= 0.3.0 && < 0.4,- parsers >= 0.12.4 && < 0.13,- text-printer >= 0.4 && < 0.5,- directory >= 1.2.6 && < 1.3,- filepath >= 1.4.1 && < 1.5,- hjsonschema >= 1.2.0 && < 1.3,- random >= 1.1 && < 1.2,- lens >= 4.14 && < 4.15,- path >= 0.5.9 && < 0.6,- path-io >= 1.2.0 && < 1.3,- temporary >= 1.2.0 && < 1.3,- protolude >= 0.1.10 && < 0.2,- stm-containers >= 0.2.15 && < 0.3,- text-icu >= 0.7.0 && < 0.8,- text-icu-normalized >= 0.1.6 && < 0.2,- yaml >= 0.8.20 && < 0.9,- zippers >= 0.2.2 && < 0.3+ aeson >= 0.11.2 && < 0.12,+ base >=4.9 && <4.10,+ base-unicode-symbols >= 0.2.2 && < 0.3,+ binary >= 0.8.3 && < 0.9,+ boomerang,+ bytestring >= 0.10.8 && < 0.11,+ containers >= 0.5.7 && < 0.6,+ containers-unicode-symbols >= 0.3.1 && < 0.4,+ contravariant >= 1.4 && < 1.5,+ data-default >= 0.7.1.1 && < 0.8,+ data-textual >= 0.3.0 && < 0.4,+ directory >= 1.2.6 && < 1.3,+ dns >= 2.0.10 && < 2.1,+ exceptions >= 0.8.3 && < 0.9,+ filepath >= 1.4.1 && < 1.5,+ hjsonschema >= 1.2.0 && < 1.3,+ lens >= 4.14 && < 4.15,+ machines >= 0.6.1 && < 0.7,+ mtl >= 2.2.1 && < 2.3,+ network >= 2.6.3.1,+ network-ip >= 0.3 && < 0.4,+ parsers >= 0.12.4 && < 0.13,+ protolude >= 0.1.10 && < 0.2,+ random >= 1.1 && < 1.2,+ semigroups >= 0.18.2 && < 0.19,+ stm >= 2.4.4 && < 2.5,+ stm-containers >= 0.2.15 && < 0.3,+ temporary >= 1.2.0 && < 1.3,+ text >= 1.2.2 && < 1.3,+ text-icu >= 0.7.0 && < 0.8,+ text-icu-normalized >= 0.1.6 && < 0.2,+ text-printer >= 0.4 && < 0.5,+ time >= 1.6.0 && < 1.7,+ transformers >= 0.5.2 && < 0.6,+ yaml >= 0.8.20 && < 0.9,+ zippers >= 0.2.2 && < 0.3 hs-source-dirs: Source default-language: Haskell2010 @@ -107,40 +115,82 @@ type: exitcode-stdio-1.0 hs-source-dirs: Tests main-is: Main.hs+ other-modules:+ TestAeson+ TestSepList+ TestTemporary+ TestTime+ Paths_liblawless build-depends:- QuickCheck,- base >= 4.9 && < 4.10,- binary >= 0.7.5.0,- bytestring,- exceptions >= 0.8.3,- filepath >= 1.4.0.0,- liblawless,- semigroups >= 0.18.2,- temporary >= 1.2.0.4,- test-framework,- test-framework-quickcheck2,- test-framework-th,- text,- time,- transformers >= 0.4.2.0+ QuickCheck,+ base >= 4.9 && < 4.10,+ binary >= 0.7.5.0,+ dns >= 2.0.10 && < 2.1,+ bytestring,+ exceptions >= 0.8.3,+ filepath >= 1.4.0.0,+ liblawless,+ network >= 2.6.3.1,+ semigroups >= 0.18.2,+ temporary >= 1.2.0.4,+ test-framework,+ test-framework-quickcheck2,+ test-framework-th,+ text,+ time,+ transformers >= 0.4.2.0 default-extensions:- NoImplicitPrelude- UnicodeSyntax- LambdaCase- ConstraintKinds- DefaultSignatures- FlexibleContexts- FlexibleInstances- FunctionalDependencies- GADTs- DeriveGeneric- DeriveDataTypeable- GeneralizedNewtypeDeriving- KindSignatures- MultiParamTypeClasses- OverloadedStrings- PartialTypeSignatures- RankNTypes- ScopedTypeVariables- TypeFamilies- TypeSynonymInstances+ NoImplicitPrelude+ UnicodeSyntax+ LambdaCase+ ConstraintKinds+ DefaultSignatures+ FlexibleContexts+ FlexibleInstances+ FunctionalDependencies+ GADTs+ DeriveGeneric+ DeriveDataTypeable+ GeneralizedNewtypeDeriving+ KindSignatures+ MultiParamTypeClasses+ OverloadedStrings+ PartialTypeSignatures+ RankNTypes+ ScopedTypeVariables+ TypeFamilies+ TypeSynonymInstances++executable ZFS+ main-is: Main.hs+ other-modules:+ Types+ Types.ZPools+ Types.ZPool+ Types.ZName+ hs-source-dirs:+ Examples/ZFS+ build-depends:+ liblawless+ default-language: Haskell2010+ default-extensions:+ NoImplicitPrelude+ UnicodeSyntax+ LambdaCase+ ConstraintKinds+ DefaultSignatures+ FlexibleContexts+ FlexibleInstances+ FunctionalDependencies+ GADTs+ DeriveGeneric+ DeriveDataTypeable+ GeneralizedNewtypeDeriving+ KindSignatures+ MultiParamTypeClasses+ OverloadedStrings+ PartialTypeSignatures+ RankNTypes+ ScopedTypeVariables+ TypeFamilies+ TypeSynonymInstances