summaryrefslogtreecommitdiff
path: root/Utility/Attoparsec.hs
blob: bd20e8e6d9737f64c11b8c2cd3e52309c32a032c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{- attoparsec utility functions
 -
 - Copyright 2019 Joey Hess <id@joeyh.name>
 - Copyright 2007-2015 Bryan O'Sullivan
 -
 - License: BSD-3-clause
 -}

module Utility.Attoparsec where

import qualified Data.Attoparsec.ByteString as A
import qualified Data.ByteString as B

-- | Parse and decode an unsigned octal number.
--
-- This parser does not accept a leading @\"0o\"@ string.
octal :: Integral a => A.Parser a
octal = B.foldl' step 0 `fmap` A.takeWhile1 isOctDigit
  where
	isOctDigit w = w >= 48 && w <= 55
	step a w = a * 8 + fromIntegral (w - 48)