loc 0.1.3.1 → 0.1.3.2
raw patch · 2 files changed
+300/−35 lines, 2 filesdep −loc-testdep ~basePVP ok
version bump matches the API change (PVP)
Dependencies removed: loc-test
Dependency ranges changed: base
API changes (from Hackage documentation)
Files
- loc-test-src/Test/Loc/Hedgehog/Gen.hs +267/−0
- loc.cabal +33/−35
+ loc-test-src/Test/Loc/Hedgehog/Gen.hs view
@@ -0,0 +1,267 @@+{-# LANGUAGE ScopedTypeVariables #-}++{- |++Hedgehog generators for types defined in the /loc/ package.++-}+module Test.Loc.Hedgehog.Gen+ (+ -- * Line+ line, line', defMaxLine++ -- * Column+ , column, column', defMaxColumn++ -- * Loc+ , loc, loc'++ -- * Span+ , span, span'++ -- * Area+ , area, area'++ -- * Generator bounds+ , Bounds, boundsSize++ ) where++import Data.Loc (ToNat (..))+import Data.Loc.Internal.Prelude+import Data.Loc.Types++import qualified Data.Loc as Loc++import Hedgehog (Gen)+import Prelude (Num (..))++import qualified Data.List as List+import qualified Data.Set as Set+import qualified Hedgehog.Gen as Gen+import qualified Hedgehog.Range as Range+++--------------------------------------------------------------------------------+-- Parameter defaults+--------------------------------------------------------------------------------++-- | The default maximum line: 99.+defMaxLine :: Line+defMaxLine = 99++-- | The default maximum column number: 99.+defMaxColumn :: Column+defMaxColumn = 99+++--------------------------------------------------------------------------------+-- Bounds+--------------------------------------------------------------------------------++-- | Inclusive lower and upper bounds on a range.+type Bounds a = (a, a)++{- |++The size of a range specified by 'Bounds'.++Assumes the upper bound is at least the lower bound.++-}+boundsSize :: Num n => (n, n) -> n+boundsSize (a, b) =+ 1 + b - a+++--------------------------------------------------------------------------------+-- Pos+--------------------------------------------------------------------------------++{- |++@'pos' a b@ generates a number on the linear range /a/ to /b/.++-}+pos :: (ToNat n, Num n)+ => Bounds n -- ^ Minimum and maximum value to generate+ -> Gen n+pos (a, b) =+ let+ range = Range.linear (toNat a) (toNat b)+ in+ fromInteger . toInteger <$> Gen.integral range++{- |++@'line' a b@ generates a line number on the linear range /a/ to /b/.++-}+line+ :: Bounds Line -- ^ Minimum and maximum line number+ -> Gen Line+line = pos++{- |++Generates a line number within the default bounds @(1, 'defMaxLine')@.++-}+line' :: Gen Line+line' =+ line (1, defMaxLine)++{- |++@'column' a b@ generates a column number on the linear range /a/ to /b/.++-}+column+ :: Bounds Column -- ^ Minimum and maximum column number+ -> Gen Column+column = pos++{- |++Generates a column number within the default bounds @(1, 'defMaxColumn')@.++-}+column' :: Gen Column+column' =+ column (1, defMaxColumn)+++--------------------------------------------------------------------------------+-- Loc+--------------------------------------------------------------------------------++{- |++@'loc' lineBounds columnBounds@ generates a 'Loc' with the line number+bounded by @lineBounds@ and column number bounded by @columnBounds@.++-}+loc+ :: Bounds Line -- ^ Minimum and maximum line number+ -> Bounds Column -- ^ Minimum and maximum column number+ -> Gen Loc+loc lineBounds columnBounds =+ Loc.loc <$> line lineBounds+ <*> column columnBounds++{- |++Generates a 'Loc' within the default line and column bounds.++-}+loc' :: Gen Loc+loc' =+ loc (1, defMaxLine) (1, defMaxColumn)+++--------------------------------------------------------------------------------+-- Span+--------------------------------------------------------------------------------++{- |++@'span' lineBounds columnBounds@ generates a 'Span' with start and end+positions whose line numbers are bounded by @lineBounds@ and whose column+numbers are bounded by @columnBounds@.++-}+span+ :: Bounds Line -- ^ Minimum and maximum line number+ -> Bounds Column -- ^ Minimum and maximum column number+ -> Gen Span+span lineBounds columnBounds@(minColumn, maxColumn) =+ let+ lines :: Gen (Line, Line)+ lines =+ line lineBounds >>= \a ->+ line lineBounds <&> \b ->+ (min a b, max a b)++ columnsDifferentLine :: Gen (Column, Column)+ columnsDifferentLine =+ column columnBounds >>= \a ->+ column columnBounds <&> \b ->+ (a, b)++ columnsSameLine :: Gen (Column, Column)+ columnsSameLine =+ column (minColumn + 1, maxColumn) >>= \a ->+ column columnBounds <&> \b ->+ case compare a b of+ EQ -> (a - 1, b)+ LT -> (a, b)+ GT -> (b, a)++ in+ lines >>= \(startLine, endLine) ->+ (if startLine /= endLine+ then columnsDifferentLine+ else columnsSameLine+ ) <&> \(startColumn, endColumn) ->++ let+ start = Loc.loc startLine startColumn+ end = Loc.loc endLine endColumn++ in+ Loc.spanFromTo start end++{- |++Generates a 'Span' with start and end positions within the default line and+column bounds.++-}+span' :: Gen Span+span' =+ span (1, defMaxLine) (1, defMaxColumn)+++--------------------------------------------------------------------------------+-- Area+--------------------------------------------------------------------------------++{- |++@'area' lineBounds columnBounds@ generates an 'Area' consisting of 'Span's+with start and end positions whose line numbers are bounded by @lineBounds@+and whose column numbers are bounded by @columnBounds@.++-}+area+ :: Bounds Line -- ^ Minimum and maximum line number+ -> Bounds Column -- ^ Minimum and maximum column number+ -> Gen Area+area lineBounds columnBounds =+ fold . snd . mapAccumL f Nothing . Set.toAscList . Set.fromList <$> locs++ where+ gridSize :: Int = fromIntegral $ toNat (boundsSize lineBounds)+ `max` toNat (boundsSize columnBounds)++ locs :: Gen [Loc] =+ loc lineBounds columnBounds+ & List.repeat+ & List.take (gridSize `div` 5)+ & sequenceA++ f :: Maybe Loc -> Loc -> (Maybe Loc, Area)+ f prevLocMay newLoc =+ case prevLocMay of+ Just prevLoc -> (Nothing, Loc.areaFromTo prevLoc newLoc)+ Nothing -> (Just newLoc, mempty)++{- |++Generates an 'Area' consisting of 'Span's with start and end positions within+the default line and column bounds.++-}+area' :: Gen Area+area' =+ area (1, defMaxLine) (1, defMaxColumn)
loc.cabal view
@@ -1,38 +1,40 @@--- This file has been generated from package.yaml by hpack version 0.18.1.------ see: https://github.com/sol/hpack+name: loc+version: 0.1.3.2 -name: loc-version: 0.1.3.1-synopsis: Types representing line and column positions and ranges in text files.+synopsis: Types representing line and column positions and ranges in text files. -description: The package name /loc/ stands for “location” and is also an allusion to the- acronym for “lines of code”.- .- The @Loc@ type represents a caret position in a text file, the @Span@ type- is a nonempty range between two @Loc@s, and the @Area@ type is a set of- non-touching @Span@s.-category: Data Structures-homepage: https://github.com/chris-martin/loc-author: Chris Martin <ch.martin@gmail.com>-maintainer: Chris Martin <ch.martin@gmail.com>-license: Apache-2.0-license-file: license.txt-build-type: Simple-cabal-version: >= 1.10+description: The package name /loc/ stands for “location” and is also an allusion to the+ acronym for “lines of code”.+ .+ The @Loc@ type represents a caret position in a text file, the @Span@ type+ is a nonempty range between two @Loc@s, and the @Area@ type is a set of+ non-touching @Span@s. +category: Data Structures++homepage: https://github.com/chris-martin/loc++author: Chris Martin <ch.martin@gmail.com>+maintainer: Chris Martin <ch.martin@gmail.com>++license: Apache-2.0+license-file: license.txt++build-type: Simple+cabal-version: >= 1.10+ extra-source-files: example.png example.svg README.md library- hs-source-dirs:- src+ default-language: Haskell2010+ hs-source-dirs: src default-extensions: NoImplicitPrelude ghc-options: -Wall build-depends:- base >= 4.9 && < 4.10+ base >=4.9 && <4.11 , containers exposed-modules: Data.Loc@@ -46,35 +48,31 @@ Data.Loc.Pos Data.Loc.Span Data.Loc.Types- other-modules:- Paths_loc- default-language: Haskell2010 test-suite doctest+ default-language: Haskell2010 type: exitcode-stdio-1.0 main-is: doctest.hs- hs-source-dirs:- test+ hs-source-dirs: test default-extensions: NoImplicitPrelude ghc-options: -Wall -threaded build-depends:- base >= 4.9 && < 4.10+ base >=4.9 && <4.11 , containers , doctest , loc- default-language: Haskell2010 test-suite hedgehog+ default-language: Haskell2010 type: exitcode-stdio-1.0 main-is: hedgehog.hs- hs-source-dirs:- test+ hs-source-dirs: test loc-test-src default-extensions: NoImplicitPrelude ghc-options: -Wall -threaded build-depends:- base >= 4.9 && < 4.10+ base >=4.9 && <4.11 , containers , hedgehog , loc- , loc-test- default-language: Haskell2010+ other-modules:+ Test.Loc.Hedgehog.Gen