Safe Haskell | None |
---|---|
Language | Haskell2010 |
Synopsis
- type LengthL n = RangeL n n
- data RangeL :: Nat -> Nat -> Type -> Type where
- class PushL n m
- (.:..) :: PushL n m => a -> RangeL n m a -> RangeL n (m + 1) a
- class AddL n m v w
- (++.) :: AddL n m v w => RangeL n m a -> RangeL v w a -> RangeL (n + v) (m + w) a
- loosenL :: (LoosenLMin n m v, LoosenLMax v m w) => RangeL n m a -> RangeL v w a
- class LoosenLMin n m v
- loosenLMin :: LoosenLMin n m v => RangeL n m a -> RangeL v m a
- class LoosenLMax n m w
- loosenLMax :: LoosenLMax n m w => RangeL n m a -> RangeL n w a
- class Unfoldr n v w
- unfoldrRange :: Unfoldr 0 v w => (s -> Bool) -> (s -> (a, s)) -> s -> RangeL v w a
- unfoldrRangeWithBase :: Unfoldr n v w => RangeL n w a -> (s -> Bool) -> (s -> (a, s)) -> s -> RangeL v w a
- unfoldrRangeWithBaseWithS :: Unfoldr n v w => RangeL n w a -> (s -> Bool) -> (s -> (a, s)) -> s -> (RangeL v w a, s)
- unfoldrMRange :: (Unfoldr 0 v w, Monad m) => m Bool -> m a -> m (RangeL v w a)
- unfoldrMRangeWithBase :: (Unfoldr n v w, Monad m) => RangeL n w a -> m Bool -> m a -> m (RangeL v w a)
- unfoldrRangeMaybe :: Unfoldr 0 v w => (s -> Maybe (a, s)) -> s -> Maybe (RangeL v w a)
- unfoldrRangeMaybeWithBase :: Unfoldr n v w => RangeL n w a -> (s -> Maybe (a, s)) -> s -> Maybe (RangeL v w a)
- unfoldrMRangeMaybe :: (Unfoldr 0 v w, Monad m) => m Bool -> m a -> m (Maybe (RangeL v w a))
- unfoldrMRangeMaybeWithBase :: (Unfoldr n v w, Monad m) => RangeL n w a -> m Bool -> m a -> m (Maybe (RangeL v w a))
- class ZipL n m v w
- zipL :: ZipL n m v w => RangeL n m a -> RangeL v w b -> (RangeL n m (a, b), RangeL (v - m) (w - n) b)
- zipWithL :: ZipL n m v w => (a -> b -> c) -> RangeL n m a -> RangeL v w b -> (RangeL n m c, RangeL (v - m) (w - n) b)
- zipWithML :: (ZipL n m v w, Monad q) => (a -> b -> q c) -> RangeL n m a -> RangeL v w b -> q (RangeL n m c, RangeL (v - m) (w - n) b)
- repeatLMin :: (LoosenLMax n n m, Unfoldr 0 n n) => a -> RangeL n m a
- repeatLMax :: (LoosenLMin m m n, Unfoldr 0 m m) => a -> RangeL n m a
- unfoldrMin :: (LoosenLMax n n m, Unfoldr 0 n n) => (s -> (a, s)) -> s -> RangeL n m a
- unfoldrMax :: (LoosenLMin m m n, Unfoldr 0 m m) => (s -> (a, s)) -> s -> RangeL n m a
- unfoldrMMin :: (Monad m, LoosenLMax n n w, Unfoldr 0 n n) => m a -> m (RangeL n w a)
- unfoldrMMax :: (Monad m, LoosenLMin w w n, Unfoldr 0 w w) => m a -> m (RangeL n w a)
- data RangeR :: Nat -> Nat -> Type -> Type where
- class PushR n m
- (.:++) :: PushR n m => RangeR n m a -> a -> RangeR n (m + 1) a
- class AddR n m v w
- (+++) :: AddR n m v w => RangeR n m a -> RangeR v w a -> RangeR (n + v) (m + w) a
- loosenR :: (LoosenRMin n m v, LoosenRMax v m w) => RangeR n m a -> RangeR v w a
- class LoosenRMin n m v
- loosenRMin :: LoosenRMin n m v => RangeR n m a -> RangeR v m a
- class LoosenRMax n m w
- loosenRMax :: LoosenRMax n m w => RangeR n m a -> RangeR n w a
- class Unfoldl n v w
- unfoldlRange :: Unfoldl 0 v w => (s -> Bool) -> (s -> (s, a)) -> s -> RangeR v w a
- unfoldlRangeWithBase :: Unfoldl n v w => (s -> Bool) -> (s -> (s, a)) -> s -> RangeR n w a -> RangeR v w a
- unfoldlRangeWithBaseWithS :: Unfoldl n v w => (s -> Bool) -> (s -> (s, a)) -> s -> RangeR n w a -> (s, RangeR v w a)
- unfoldlMRange :: (Unfoldl 0 v w, Monad m) => m Bool -> m a -> m (RangeR v w a)
- unfoldlMRangeWithBase :: (Unfoldl n v w, Monad m) => m Bool -> m a -> RangeR n w a -> m (RangeR v w a)
- unfoldlRangeMaybe :: Unfoldl 0 v w => (s -> Maybe (s, a)) -> s -> Maybe (RangeR v w a)
- unfoldlRangeMaybeWithBase :: Unfoldl n v w => (s -> Maybe (s, a)) -> s -> RangeR n w a -> Maybe (RangeR v w a)
- unfoldlMRangeMaybe :: (Unfoldl 0 v w, Monad m) => m Bool -> m a -> m (Maybe (RangeR v w a))
- unfoldlMRangeMaybeWithBase :: (Unfoldl n v w, Monad m) => m Bool -> m a -> RangeR n w a -> m (Maybe (RangeR v w a))
- class ZipR n m v w
- zipR :: ZipR n m v w => RangeR n m a -> RangeR v w b -> (RangeR (n - w) (m - v) a, RangeR v w (a, b))
- zipWithR :: ZipR n m v w => (a -> b -> c) -> RangeR n m a -> RangeR v w b -> (RangeR (n - w) (m - v) a, RangeR v w c)
- zipWithMR :: (ZipR n m v w, Monad q) => (a -> b -> q c) -> RangeR n m a -> RangeR v w b -> q (RangeR (n - w) (m - v) a, RangeR v w c)
- repeatRMin :: (LoosenRMax n n m, Unfoldl 0 n n) => a -> RangeR n m a
- repeatRMax :: (LoosenRMin m m n, Unfoldl 0 m m) => a -> RangeR n m a
- unfoldlMin :: (LoosenRMax n n m, Unfoldl 0 n n) => (s -> (s, a)) -> s -> RangeR n m a
- unfoldlMax :: (LoosenRMin m m n, Unfoldl 0 m m) => (s -> (s, a)) -> s -> RangeR n m a
- unfoldlMMin :: (Monad m, LoosenRMax n n w, Unfoldl 0 n n) => m a -> m (RangeR n w a)
- unfoldlMMax :: (Monad m, LoosenRMin w w n, Unfoldl 0 w w) => m a -> m (RangeR n w a)
- class LeftToRight n m v w
- (++.+) :: LeftToRight n m v w => RangeR n m a -> RangeL v w a -> RangeR (n + v) (m + w) a
- leftToRight :: forall v w a. LeftToRight 0 0 v w => RangeL v w a -> RangeR v w a
- class RightToLeft n m v w
- (++..) :: RightToLeft n m v w => RangeR n m a -> RangeL v w a -> RangeL (n + v) (m + w) a
- rightToLeft :: forall n m a. RightToLeft n m 0 0 => RangeR n m a -> RangeL n m a
RANGED LIST LEFT
type LengthL n = RangeL n n Source #
The value of LengthL n a
is a list which have just n
members of type a
.
You can push and pop an element from left.
>>>
:set -XDataKinds
>>>
sampleLengthL = 'h' :. 'e' :. 'l' :. 'l' :. 'o' :. NilL :: LengthL 5 Char
Type
data RangeL :: Nat -> Nat -> Type -> Type where Source #
The value of RangeL n m a
is a list of type a
values whose element number is
at minimum n
, and at maximum m
.
You can push and pop an element from left.
>>>
:set -XDataKinds
>>>
sampleRangeL = 'h' :. 'e' :. 'l' :. 'l' :.. 'o' :.. NilL :: RangeL 3 8 Char
NilL :: 0 <= m => RangeL 0 m a | |
(:..) :: 1 <= m => a -> RangeL 0 (m - 1) a -> RangeL 0 m a infixr 6 | |
(:.) :: (1 <= n, 1 <= m) => a -> RangeL (n - 1) (m - 1) a -> RangeL n m a infixr 6 |
Instances
(1 <= n, Applicative (LengthL n), Monad (LengthL (n - 1))) => Monad (LengthL n) Source # | |
Applicative (LengthL 0) => Monad (LengthL 0) Source # | |
Applicative (LengthL 0) Source # | |
(1 <= n, Functor (RangeL (n - 1) (m - 1))) => Functor (RangeL n m) Source # | |
Functor (RangeL 0 (m - 1)) => Functor (RangeL 0 m) Source # | |
Functor (RangeL 0 0) Source # | |
(1 <= n, Functor (RangeL n m), Applicative (RangeL (n - 1) (m - 1)), Unfoldr 0 n m) => Applicative (RangeL n m) Source # | |
Defined in Data.List.Range.RangeL | |
(Functor (RangeL 0 m), Applicative (RangeL 0 (m - 1)), Unfoldr 0 0 m) => Applicative (RangeL 0 m) Source # | |
Defined in Data.List.Range.RangeL | |
(1 <= n, Foldable (RangeL (n - 1) (m - 1))) => Foldable (RangeL n m) Source # | |
Defined in Data.List.Range.RangeL fold :: Monoid m0 => RangeL n m m0 -> m0 # foldMap :: Monoid m0 => (a -> m0) -> RangeL n m a -> m0 # foldMap' :: Monoid m0 => (a -> m0) -> RangeL n m a -> m0 # foldr :: (a -> b -> b) -> b -> RangeL n m a -> b # foldr' :: (a -> b -> b) -> b -> RangeL n m a -> b # foldl :: (b -> a -> b) -> b -> RangeL n m a -> b # foldl' :: (b -> a -> b) -> b -> RangeL n m a -> b # foldr1 :: (a -> a -> a) -> RangeL n m a -> a # foldl1 :: (a -> a -> a) -> RangeL n m a -> a # toList :: RangeL n m a -> [a] # null :: RangeL n m a -> Bool # length :: RangeL n m a -> Int # elem :: Eq a => a -> RangeL n m a -> Bool # maximum :: Ord a => RangeL n m a -> a # minimum :: Ord a => RangeL n m a -> a # | |
Foldable (RangeL 0 (m - 1)) => Foldable (RangeL 0 m) Source # | |
Defined in Data.List.Range.RangeL fold :: Monoid m0 => RangeL 0 m m0 -> m0 # foldMap :: Monoid m0 => (a -> m0) -> RangeL 0 m a -> m0 # foldMap' :: Monoid m0 => (a -> m0) -> RangeL 0 m a -> m0 # foldr :: (a -> b -> b) -> b -> RangeL 0 m a -> b # foldr' :: (a -> b -> b) -> b -> RangeL 0 m a -> b # foldl :: (b -> a -> b) -> b -> RangeL 0 m a -> b # foldl' :: (b -> a -> b) -> b -> RangeL 0 m a -> b # foldr1 :: (a -> a -> a) -> RangeL 0 m a -> a # foldl1 :: (a -> a -> a) -> RangeL 0 m a -> a # toList :: RangeL 0 m a -> [a] # null :: RangeL 0 m a -> Bool # length :: RangeL 0 m a -> Int # elem :: Eq a => a -> RangeL 0 m a -> Bool # maximum :: Ord a => RangeL 0 m a -> a # minimum :: Ord a => RangeL 0 m a -> a # | |
Foldable (RangeL 0 0) Source # | |
Defined in Data.List.Range.RangeL fold :: Monoid m => RangeL 0 0 m -> m # foldMap :: Monoid m => (a -> m) -> RangeL 0 0 a -> m # foldMap' :: Monoid m => (a -> m) -> RangeL 0 0 a -> m # foldr :: (a -> b -> b) -> b -> RangeL 0 0 a -> b # foldr' :: (a -> b -> b) -> b -> RangeL 0 0 a -> b # foldl :: (b -> a -> b) -> b -> RangeL 0 0 a -> b # foldl' :: (b -> a -> b) -> b -> RangeL 0 0 a -> b # foldr1 :: (a -> a -> a) -> RangeL 0 0 a -> a # foldl1 :: (a -> a -> a) -> RangeL 0 0 a -> a # toList :: RangeL 0 0 a -> [a] # null :: RangeL 0 0 a -> Bool # length :: RangeL 0 0 a -> Int # elem :: Eq a => a -> RangeL 0 0 a -> Bool # maximum :: Ord a => RangeL 0 0 a -> a # minimum :: Ord a => RangeL 0 0 a -> a # | |
(1 <= n, Traversable (RangeL (n - 1) (m - 1))) => Traversable (RangeL n m) Source # | |
Defined in Data.List.Range.RangeL | |
Traversable (RangeL 0 (m - 1)) => Traversable (RangeL 0 m) Source # | |
Defined in Data.List.Range.RangeL | |
Traversable (RangeL 0 0) Source # | |
Defined in Data.List.Range.RangeL | |
(Foldable (RangeL n m), Unfoldr 0 n m) => IsList (RangeL n m a) Source # | |
Show a => Show (RangeL n m a) Source # | |
Unfoldr 0 n m => IsString (RangeL n m Char) Source # | |
Defined in Data.List.Range.RangeL fromString :: String -> RangeL n m Char # | |
type Item (RangeL n m a) Source # | |
Defined in Data.List.Range.RangeL |
PushL
(.:..) :: PushL n m => a -> RangeL n m a -> RangeL n (m + 1) a infixr 5 Source #
To push an optional element.
>>>
:set -XDataKinds
>>>
samplePushL = 'e' :. 'l' :. 'l' :. 'o' :.. NilL :: RangeL 3 7 Char
>>>
'h' .:.. samplePushL
'h' :. ('e' :. ('l' :. ('l' :.. ('o' :.. NilL))))>>>
:type 'h' .:.. samplePushL
'h' .:.. samplePushL :: RangeL 3 8 Char
AddL
(++.) :: AddL n m v w => RangeL n m a -> RangeL v w a -> RangeL (n + v) (m + w) a infixr 5 Source #
To concatenate two lists
whose types are RangeL n m a
and RangeL v w a
.
>>>
:set -XDataKinds
>>>
sampleAddL1 = 'f' :. 'o' :. 'o' :.. NilL :: RangeL 2 5 Char
>>>
sampleAddL2 = 'b' :. 'a' :.. 'r' :.. NilL :: RangeL 1 6 Char
>>>
sampleAddL1 ++. sampleAddL2
'f' :. ('o' :. ('o' :. ('b' :.. ('a' :.. ('r' :.. NilL)))))>>>
:type sampleAddL1 ++. sampleAddL2
sampleAddL1 ++. sampleAddL2 :: RangeL 3 11 Char
LoosenLMin and LoosenLMax
loosenL
loosenL :: (LoosenLMin n m v, LoosenLMax v m w) => RangeL n m a -> RangeL v w a Source #
To loosen a range of an element number.
>>>
:set -XDataKinds
>>>
sampleLoosenL = 'h' :. 'e' :. 'l' :. 'l' :. 'o' :.. NilL :: RangeL 4 6 Char
>>>
loosenL sampleLoosenL :: RangeL 2 8 Char
'h' :. ('e' :. ('l' :.. ('l' :.. ('o' :.. NilL))))
loosenLMin
class LoosenLMin n m v Source #
Instances
(1 <= n, 1 <= v, LoosenLMin (n - 1) (m - 1) (v - 1)) => LoosenLMin n m v Source # | |
Defined in Data.List.Range.RangeL loosenLMin :: RangeL n m a -> RangeL v m a Source # | |
(1 <= n, LoosenLMin (n - 1) (m - 1) 0) => LoosenLMin n m 0 Source # | |
Defined in Data.List.Range.RangeL loosenLMin :: RangeL n m a -> RangeL 0 m a Source # | |
LoosenLMin 0 m 0 Source # | |
Defined in Data.List.Range.RangeL loosenLMin :: RangeL 0 m a -> RangeL 0 m a Source # |
loosenLMin :: LoosenLMin n m v => RangeL n m a -> RangeL v m a Source #
To loosen a lower bound of an element number.
>>>
:set -XDataKinds -fno-warn-tabs
>>>
:{
sampleLoosenLMin :: RangeL 4 6 Char sampleLoosenLMin = 'h' :. 'e' :. 'l' :. 'l' :. 'o' :.. NilL :}
>>>
loosenLMin sampleLoosenLMin :: RangeL 2 6 Char
'h' :. ('e' :. ('l' :.. ('l' :.. ('o' :.. NilL))))
loosenLMax
class LoosenLMax n m w Source #
Instances
(1 <= n, 1 <= w, LoosenLMax (n - 1) (m - 1) (w - 1)) => LoosenLMax n m w Source # | |
Defined in Data.List.Range.RangeL loosenLMax :: RangeL n m a -> RangeL n w a Source # | |
(1 <= w, LoosenLMax 0 (m - 1) (w - 1)) => LoosenLMax 0 m w Source # | |
Defined in Data.List.Range.RangeL loosenLMax :: RangeL 0 m a -> RangeL 0 w a Source # | |
LoosenLMax 0 0 w Source # | |
Defined in Data.List.Range.RangeL loosenLMax :: RangeL 0 0 a -> RangeL 0 w a Source # |
loosenLMax :: LoosenLMax n m w => RangeL n m a -> RangeL n w a Source #
To loosen an upper bound of an element number.
>>>
:set -XDataKinds -fno-warn-tabs
>>>
:{
sampleLoosenLMax :: RangeL 4 6 Char sampleLoosenLMax = 'h' :. 'e' :. 'l' :. 'l' :. 'o' :.. NilL :}
>>>
loosenLMax sampleLoosenLMax :: RangeL 4 8 Char
'h' :. ('e' :. ('l' :. ('l' :. ('o' :.. NilL))))
Unfoldr
class
unfoldrRange
without monad
unfoldrRange :: Unfoldr 0 v w => (s -> Bool) -> (s -> (a, s)) -> s -> RangeL v w a Source #
To evaluate a function to construct a list. The function recieve a state and return an element and a new state. First argument is a predication which is evaluated when an element number is greater than a minimum and not greater than a maximum.
>>>
:set -XDataKinds
>>>
next n = (n * 3, n + 1)
>>>
unfoldrRange (< 2) next 1 :: RangeL 3 5 Int
3 :. (6 :. (9 :. NilL))
>>>
unfoldrRange (< 5) next 1 :: RangeL 3 5 Int
3 :. (6 :. (9 :. (12 :.. NilL)))
>>>
unfoldrRange (< 10) next 1 :: RangeL 3 5 Int
3 :. (6 :. (9 :. (12 :.. (15 :.. NilL))))
unfoldrRangeWithBase :: Unfoldr n v w => RangeL n w a -> (s -> Bool) -> (s -> (a, s)) -> s -> RangeL v w a Source #
It is like unfoldrRange
. But it has already prepared values.
>>>
:set -XDataKinds
>>>
xs = 123 :. 456 :.. NilL :: RangeL 1 5 Integer
>>>
unfoldrRangeWithBase xs (< 3) (\n -> (n * 3, n + 1)) 1 :: RangeL 3 5 Integer
123 :. (456 :. (3 :. (6 :.. NilL)))
unfoldrRangeWithBaseWithS :: Unfoldr n v w => RangeL n w a -> (s -> Bool) -> (s -> (a, s)) -> s -> (RangeL v w a, s) Source #
It is like unfoldrRangeWithBase
.
But it return not only a list but also a state value.
>>>
:set -XDataKinds
>>>
next n = (n * 3, n + 1)
>>>
xs = 123 :. 456 :.. NilL :: RangeL 1 5 Integer
>>>
unfoldrRangeWithBaseWithS xs (< 3) next 1 :: (RangeL 3 5 Integer, Integer)
(123 :. (456 :. (3 :. (6 :.. NilL))),3)
with monad
unfoldrMRange :: (Unfoldr 0 v w, Monad m) => m Bool -> m a -> m (RangeL v w a) Source #
It is like unfoldrRange
. But it use a monad instead of a function.
>>>
:set -XDataKinds
>>>
:module + Data.IORef
>>>
r <- newIORef 1
>>>
count = readIORef r >>= \n -> n * 3 <$ writeIORef r (n + 1)
>>>
unfoldrMRange ((< 5) <$> readIORef r) count :: IO (RangeL 3 5 Integer)
3 :. (6 :. (9 :. (12 :.. NilL)))
unfoldrMRangeWithBase :: (Unfoldr n v w, Monad m) => RangeL n w a -> m Bool -> m a -> m (RangeL v w a) Source #
It is like unfoldrMRange
. But it has already prepared values.
>>>
:set -XDataKinds
>>>
:module + Data.IORef
>>>
r <- newIORef 1
>>>
check = (< 3) <$> readIORef r
>>>
count = readIORef r >>= \n -> n * 3 <$ writeIORef r (n + 1)
>>>
xs = 123 :. 456 :.. NilL :: RangeL 1 5 Integer
>>>
unfoldrMRangeWithBase xs check count :: IO (RangeL 3 5 Integer)
123 :. (456 :. (3 :. (6 :.. NilL)))
unfoldrRangeMaybe
without monad
unfoldrRangeMaybe :: Unfoldr 0 v w => (s -> Maybe (a, s)) -> s -> Maybe (RangeL v w a) Source #
To eveluate a function to construct a list. The function recieve a state and return a nothing value or an element and a new state. If number of created elements is less than a minimum number of list elements or greater than a maximum number, then return Nothing.
>>>
:set -XDataKinds
>>>
next n0 n = if n < n0 then Just (n * 3, n + 1) else Nothing
>>>
unfoldrRangeMaybe (next 2) 1 :: Maybe (RangeL 3 5 Int)
Nothing
>>>
unfoldrRangeMaybe (next 5) 1 :: Maybe (RangeL 3 5 Int)
Just (3 :. (6 :. (9 :. (12 :.. NilL))))
>>>
unfoldrRangeMaybe (next 10) 1 :: Maybe (RangeL 3 5 Int)
Nothing
unfoldrRangeMaybeWithBase :: Unfoldr n v w => RangeL n w a -> (s -> Maybe (a, s)) -> s -> Maybe (RangeL v w a) Source #
It is like unfoldrRangeMaybe
. But it has already prepared values.
>>>
:set -XDataKinds
>>>
xs = 123 :. 456 :.. NilL :: RangeL 1 5 Int
>>>
next n = if n < 3 then Just (n * 3, n + 1) else Nothing
>>>
unfoldrRangeMaybeWithBase xs next 1 :: Maybe (RangeL 3 5 Int)
Just (123 :. (456 :. (3 :. (6 :.. NilL))))
with monad
unfoldrMRangeMaybe :: (Unfoldr 0 v w, Monad m) => m Bool -> m a -> m (Maybe (RangeL v w a)) Source #
It is like unfoldrRangeMaybe
.
But it use a monad instead of a function.
The first argument monad return boolean value.
It create values while this boolean value is True.
If this boolean value is False before to create enough values or
True after to create full values, then unfoldrMRangeMaybe
return Nothing.
>>>
:set -XDataKinds
>>>
:module + Data.IORef
>>>
r <- newIORef 1
>>>
check n0 = (< n0) <$> readIORef r
>>>
count = readIORef r >>= \n -> n * 3 <$ writeIORef r (n + 1)
>>>
unfoldrMRangeMaybe (check 2) count :: IO (Maybe (RangeL 3 5 Integer))
Nothing
>>>
writeIORef r 1
>>>
unfoldrMRangeMaybe (check 5) count :: IO (Maybe (RangeL 3 5 Integer))
Just (3 :. (6 :. (9 :. (12 :.. NilL))))
>>>
writeIORef r 1
>>>
unfoldrMRangeMaybe (check 10) count :: IO (Maybe (RangeL 3 5 Integer))
Nothing
unfoldrMRangeMaybeWithBase :: (Unfoldr n v w, Monad m) => RangeL n w a -> m Bool -> m a -> m (Maybe (RangeL v w a)) Source #
It is like unfoldrMRangeMaybe
.
But it has already prepared values.
>>>
:set -XDataKinds -fno-warn-tabs
>>>
:module + Data.IORef
>>>
r <- newIORef 1
>>>
check = (< 3) <$> readIORef r
>>>
count = readIORef r >>= \n -> n * 3 <$ writeIORef r (n + 1)
>>>
xs = 123 :. 456 :.. NilL :: RangeL 1 5 Integer
>>>
:{
unfoldrMRangeMaybeWithBase xs check count :: IO (Maybe (RangeL 3 5 Integer)) :} Just (123 :. (456 :. (3 :. (6 :.. NilL))))
ZipL
zipL :: ZipL n m v w => RangeL n m a -> RangeL v w b -> (RangeL n m (a, b), RangeL (v - m) (w - n) b) Source #
To recieve two lists and return a tuple list and rest of the second list. The first list must be shorter or equal than the second list.
>>>
:set -XDataKinds
>>>
sampleZipL1 = 1 :. 2 :. 3 :.. NilL :: RangeL 2 4 Integer
>>>
sampleZipL2 = 7 :. 6 :. 5 :. 4 :. 3 :. 2 :.. NilL :: RangeL 5 7 Integer
>>>
zipL sampleZipL1 sampleZipL2
((1,7) :. ((2,6) :. ((3,5) :.. NilL)),4 :. (3 :.. (2 :.. NilL)))>>>
:type zipL sampleZipL1 sampleZipL2
zipL sampleZipL1 sampleZipL2 :: (RangeL 2 4 (Integer, Integer), RangeL 1 5 Integer)
zipWithL :: ZipL n m v w => (a -> b -> c) -> RangeL n m a -> RangeL v w b -> (RangeL n m c, RangeL (v - m) (w - n) b) Source #
It is like zipL
.
But it evaluate a function to make values instead of put together in tuples.
>>>
:set -XDataKinds
>>>
sampleZipWithL1 = 1 :. 2 :. 3 :.. NilL :: RangeL 2 4 Integer
>>>
sampleZipWithL2 = 7 :. 6 :. 5 :. 4 :. 3 :. 2 :.. NilL :: RangeL 5 7 Integer
>>>
zipWithL (+) sampleZipWithL1 sampleZipWithL2
(8 :. (8 :. (8 :.. NilL)),4 :. (3 :.. (2 :.. NilL)))>>>
:type zipWithL (+) sampleZipWithL1 sampleZipWithL2
zipWithL (+) sampleZipWithL1 sampleZipWithL2 :: (RangeL 2 4 Integer, RangeL 1 5 Integer)
zipWithML :: (ZipL n m v w, Monad q) => (a -> b -> q c) -> RangeL n m a -> RangeL v w b -> q (RangeL n m c, RangeL (v - m) (w - n) b) Source #
It is like zipWithL
.
But it use a function which return a monad instead of a simple value.
>>>
:set -XDataKinds -fno-warn-tabs
>>>
ns = 1 :. 2 :. 3 :.. NilL :: RangeL 2 4 Int
>>>
:{
cs :: RangeL 5 7 Char cs = 'a' :. 'b' :. 'c' :. 'd' :. 'e' :. 'f' :.. NilL :}
>>>
zipWithML (\n -> putStrLn . replicate n) ns cs
a bb ccc (() :. (() :. (() :.. NilL)),'d' :. ('e' :.. ('f' :.. NilL)))
Repeat and Unfoldr Min and Max
repeat
repeatLMin :: (LoosenLMax n n m, Unfoldr 0 n n) => a -> RangeL n m a Source #
To repeat a value minimum number of times.
>>>
:set -XDataKinds
>>>
repeatLMin 123 :: RangeL 3 5 Integer
123 :. (123 :. (123 :. NilL))
repeatLMax :: (LoosenLMin m m n, Unfoldr 0 m m) => a -> RangeL n m a Source #
To repeat a value maximum number of times.
>>>
:set -XDataKinds
>>>
repeatLMax 123 :: RangeL 3 5 Integer
123 :. (123 :. (123 :. (123 :.. (123 :.. NilL))))
unfoldr
unfoldrMin :: (LoosenLMax n n m, Unfoldr 0 n n) => (s -> (a, s)) -> s -> RangeL n m a Source #
To evaluate a function to construct values minimum number of times. The function recieve a state and return a value and a new state.
>>>
:set -XDataKinds
>>>
unfoldrMin (\n -> (n * 3, n + 1)) 1 :: RangeL 3 5 Integer
3 :. (6 :. (9 :. NilL))
unfoldrMax :: (LoosenLMin m m n, Unfoldr 0 m m) => (s -> (a, s)) -> s -> RangeL n m a Source #
To evaluate a function to construct values maximum number of times. The function recieve a state and return a value and a new state.
>>>
:set -XDataKinds
>>>
unfoldrMax (\n -> (n * 3, n + 1)) 1 :: RangeL 3 5 Integer
3 :. (6 :. (9 :. (12 :.. (15 :.. NilL))))
unfoldrM
unfoldrMMin :: (Monad m, LoosenLMax n n w, Unfoldr 0 n n) => m a -> m (RangeL n w a) Source #
It is like unfoldrMin
. But it use a monad instead of a function.
>>>
:set -XDataKinds
>>>
:module + Data.IORef
>>>
r <- newIORef 1
>>>
count = readIORef r >>= \n -> n * 3 <$ writeIORef r (n + 1)
>>>
unfoldrMMin count :: IO (RangeL 3 5 Integer)
3 :. (6 :. (9 :. NilL))
unfoldrMMax :: (Monad m, LoosenLMin w w n, Unfoldr 0 w w) => m a -> m (RangeL n w a) Source #
It is like unfoldrMax
. But it use a monad instead of a function.
>>>
:set -XDataKinds
>>>
:module + Data.IORef
>>>
r <- newIORef 1
>>>
count = readIORef r >>= \n -> n * 3 <$ writeIORef r (n + 1)
>>>
unfoldrMMax count :: IO (RangeL 3 5 Integer)
3 :. (6 :. (9 :. (12 :.. (15 :.. NilL))))
RANGED LIST RIGHT
Type
data RangeR :: Nat -> Nat -> Type -> Type where Source #
RangeR n m a
is a list of type a
values whose element number is
at minimum n
, and at maximum m
.
You can push and pop an element from right.
>>>
:set -XDataKinds
>>>
sampleRangeR = NilR :++ 'h' :++ 'e' :+ 'l' :+ 'l' :+ 'o' :: RangeR 3 8 Char
NilR :: 0 <= m => RangeR 0 m a | |
(:++) :: 1 <= m => RangeR 0 (m - 1) a -> a -> RangeR 0 m a infixl 6 | |
(:+) :: (1 <= n, 1 <= m) => RangeR (n - 1) (m - 1) a -> a -> RangeR n m a infixl 6 |
Instances
(1 <= n, Applicative (RangeR n n), Monad (RangeR (n - 1) (n - 1))) => Monad (RangeR n n) Source # | |
Applicative (RangeR 0 0) => Monad (RangeR 0 0) Source # | |
(1 <= n, Functor (RangeR (n - 1) (m - 1))) => Functor (RangeR n m) Source # | |
Functor (RangeR 0 (m - 1)) => Functor (RangeR 0 m) Source # | |
Functor (RangeR 0 0) Source # | |
(1 <= n, Functor (RangeR n m), Applicative (RangeR (n - 1) (m - 1)), Unfoldl 0 n m) => Applicative (RangeR n m) Source # | |
Defined in Data.List.Range.RangeR | |
(1 <= n, Functor (RangeR n n), Applicative (RangeR (n - 1) (n - 1)), Unfoldl 0 n n) => Applicative (RangeR n n) Source # | |
Defined in Data.List.Range.RangeR | |
(Functor (RangeR 0 m), Applicative (RangeR 0 (m - 1)), Unfoldl 0 0 m) => Applicative (RangeR 0 m) Source # | |
Defined in Data.List.Range.RangeR | |
Applicative (RangeR 0 0) Source # | |
Defined in Data.List.Range.RangeR | |
(1 <= n, Foldable (RangeR (n - 1) (m - 1))) => Foldable (RangeR n m) Source # | |
Defined in Data.List.Range.RangeR fold :: Monoid m0 => RangeR n m m0 -> m0 # foldMap :: Monoid m0 => (a -> m0) -> RangeR n m a -> m0 # foldMap' :: Monoid m0 => (a -> m0) -> RangeR n m a -> m0 # foldr :: (a -> b -> b) -> b -> RangeR n m a -> b # foldr' :: (a -> b -> b) -> b -> RangeR n m a -> b # foldl :: (b -> a -> b) -> b -> RangeR n m a -> b # foldl' :: (b -> a -> b) -> b -> RangeR n m a -> b # foldr1 :: (a -> a -> a) -> RangeR n m a -> a # foldl1 :: (a -> a -> a) -> RangeR n m a -> a # toList :: RangeR n m a -> [a] # null :: RangeR n m a -> Bool # length :: RangeR n m a -> Int # elem :: Eq a => a -> RangeR n m a -> Bool # maximum :: Ord a => RangeR n m a -> a # minimum :: Ord a => RangeR n m a -> a # | |
Foldable (RangeR 0 (m - 1)) => Foldable (RangeR 0 m) Source # | |
Defined in Data.List.Range.RangeR fold :: Monoid m0 => RangeR 0 m m0 -> m0 # foldMap :: Monoid m0 => (a -> m0) -> RangeR 0 m a -> m0 # foldMap' :: Monoid m0 => (a -> m0) -> RangeR 0 m a -> m0 # foldr :: (a -> b -> b) -> b -> RangeR 0 m a -> b # foldr' :: (a -> b -> b) -> b -> RangeR 0 m a -> b # foldl :: (b -> a -> b) -> b -> RangeR 0 m a -> b # foldl' :: (b -> a -> b) -> b -> RangeR 0 m a -> b # foldr1 :: (a -> a -> a) -> RangeR 0 m a -> a # foldl1 :: (a -> a -> a) -> RangeR 0 m a -> a # toList :: RangeR 0 m a -> [a] # null :: RangeR 0 m a -> Bool # length :: RangeR 0 m a -> Int # elem :: Eq a => a -> RangeR 0 m a -> Bool # maximum :: Ord a => RangeR 0 m a -> a # minimum :: Ord a => RangeR 0 m a -> a # | |
Foldable (RangeR 0 0) Source # | |
Defined in Data.List.Range.RangeR fold :: Monoid m => RangeR 0 0 m -> m # foldMap :: Monoid m => (a -> m) -> RangeR 0 0 a -> m # foldMap' :: Monoid m => (a -> m) -> RangeR 0 0 a -> m # foldr :: (a -> b -> b) -> b -> RangeR 0 0 a -> b # foldr' :: (a -> b -> b) -> b -> RangeR 0 0 a -> b # foldl :: (b -> a -> b) -> b -> RangeR 0 0 a -> b # foldl' :: (b -> a -> b) -> b -> RangeR 0 0 a -> b # foldr1 :: (a -> a -> a) -> RangeR 0 0 a -> a # foldl1 :: (a -> a -> a) -> RangeR 0 0 a -> a # toList :: RangeR 0 0 a -> [a] # null :: RangeR 0 0 a -> Bool # length :: RangeR 0 0 a -> Int # elem :: Eq a => a -> RangeR 0 0 a -> Bool # maximum :: Ord a => RangeR 0 0 a -> a # minimum :: Ord a => RangeR 0 0 a -> a # | |
(1 <= n, Traversable (RangeR (n - 1) (m - 1))) => Traversable (RangeR n m) Source # | |
Defined in Data.List.Range.RangeR | |
Traversable (RangeR 0 (m - 1)) => Traversable (RangeR 0 m) Source # | |
Defined in Data.List.Range.RangeR | |
Traversable (RangeR 0 0) Source # | |
Defined in Data.List.Range.RangeR | |
(Foldable (RangeR n m), Unfoldl 0 n m) => IsList (RangeR n m a) Source # | |
Show a => Show (RangeR n m a) Source # | |
Unfoldl 0 n m => IsString (RangeR n m Char) Source # | |
Defined in Data.List.Range.RangeR fromString :: String -> RangeR n m Char # | |
type Item (RangeR n m a) Source # | |
Defined in Data.List.Range.RangeR |
PushR
(.:++) :: PushR n m => RangeR n m a -> a -> RangeR n (m + 1) a infixl 5 Source #
To push an optional element.
>>>
:set -XDataKinds
>>>
samplePushR = NilR :++ 'h' :+ 'e' :+ 'l' :+ 'l' :: RangeR 3 7 Char
>>>
samplePushR .:++ 'o'
((((NilR :++ 'h') :++ 'e') :+ 'l') :+ 'l') :+ 'o'>>>
:type samplePushR .:++ 'o'
samplePushR .:++ 'o' :: RangeR 3 8 Char
AddR
(+++) :: AddR n m v w => RangeR n m a -> RangeR v w a -> RangeR (n + v) (m + w) a infixl 5 Source #
To concatenate two lists whose types are RangeR n m a
and RangeR v w a
.
>>>
:set -XDataKinds
>>>
sampleRangeR1 = NilR :++ 'f' :+ 'o' :+ 'o' :: RangeR 2 5 Char
>>>
sampleRangeR2 = NilR :++ 'b' :++ 'a' :+ 'r' :: RangeR 1 6 Char
>>>
sampleRangeR1 +++ sampleRangeR2
(((((NilR :++ 'f') :++ 'o') :++ 'o') :+ 'b') :+ 'a') :+ 'r'>>>
:type sampleRangeR1 +++ sampleRangeR2
sampleRangeR1 +++ sampleRangeR2 :: RangeR 3 11 Char
LoosenRMin and LoosenRMax
loosenR
loosenR :: (LoosenRMin n m v, LoosenRMax v m w) => RangeR n m a -> RangeR v w a Source #
To loosen a range of element number.
>>>
:set -XDataKinds
>>>
sampleLoosenR = NilR :++ 'h' :+ 'e' :+ 'l' :+ 'l' :+ 'o' :: RangeR 4 6 Char
>>>
loosenR sampleLoosenR :: RangeR 2 8 Char
((((NilR :++ 'h') :++ 'e') :++ 'l') :+ 'l') :+ 'o'
loosenRMin
class LoosenRMin n m v Source #
Instances
(1 <= n, 1 <= v, LoosenRMin (n - 1) (m - 1) (v - 1)) => LoosenRMin n m v Source # | |
Defined in Data.List.Range.RangeR loosenRMin :: RangeR n m a -> RangeR v m a Source # | |
(1 <= n, LoosenRMin (n - 1) (m - 1) 0) => LoosenRMin n m 0 Source # | |
Defined in Data.List.Range.RangeR loosenRMin :: RangeR n m a -> RangeR 0 m a Source # | |
LoosenRMin 0 m 0 Source # | |
Defined in Data.List.Range.RangeR loosenRMin :: RangeR 0 m a -> RangeR 0 m a Source # |
loosenRMin :: LoosenRMin n m v => RangeR n m a -> RangeR v m a Source #
To loosen a lower bound of element number.
>>>
:set -XDataKinds -fno-warn-tabs
>>>
:{
sampleLoosenRMin :: RangeR 4 6 Char sampleLoosenRMin = NilR :++ 'h' :+ 'e' :+ 'l' :+ 'l' :+ 'o' :}
>>>
loosenRMin sampleLoosenRMin :: RangeR 2 6 Char
((((NilR :++ 'h') :++ 'e') :++ 'l') :+ 'l') :+ 'o'
loosenRMax
class LoosenRMax n m w Source #
Instances
(1 <= n, 1 <= w, LoosenRMax (n - 1) (m - 1) (w - 1)) => LoosenRMax n m w Source # | |
Defined in Data.List.Range.RangeR loosenRMax :: RangeR n m a -> RangeR n w a Source # | |
(1 <= w, LoosenRMax 0 (m - 1) (w - 1)) => LoosenRMax 0 m w Source # | |
Defined in Data.List.Range.RangeR loosenRMax :: RangeR 0 m a -> RangeR 0 w a Source # | |
LoosenRMax 0 0 m Source # | |
Defined in Data.List.Range.RangeR loosenRMax :: RangeR 0 0 a -> RangeR 0 m a Source # |
loosenRMax :: LoosenRMax n m w => RangeR n m a -> RangeR n w a Source #
To loosen an upper bound of element number.
>>>
:set -XDataKinds -fno-warn-tabs
>>>
:{
sampleLoosenRMax :: RangeR 4 6 Char sampleLoosenRMax = NilR :++ 'h' :+ 'e' :+ 'l' :+ 'l' :+ 'o' :}
>>>
loosenRMax sampleLoosenRMax :: RangeR 4 8 Char
((((NilR :++ 'h') :+ 'e') :+ 'l') :+ 'l') :+ 'o'
Unfoldl
class
unfoldlRange
without monad
unfoldlRange :: Unfoldl 0 v w => (s -> Bool) -> (s -> (s, a)) -> s -> RangeR v w a Source #
To eveluate a function to construct a list. The function recieve a state and return an element and a new state. The first argument is a predication which is evaluated when an element number is greater than a minimum and not greater than a maximum.
>>>
:set -XDataKinds
>>>
unfoldlRange (< 2) (\n -> (n + 1, n * 3)) 1 :: RangeR 3 5 Int
((NilR :+ 9) :+ 6) :+ 3
>>>
unfoldlRange (< 5) (\n -> (n + 1, n * 3)) 1 :: RangeR 3 5 Int
(((NilR :++ 12) :+ 9) :+ 6) :+ 3
>>>
unfoldlRange (< 10) (\n -> (n + 1, n * 3)) 1 :: RangeR 3 5 Int
((((NilR :++ 15) :++ 12) :+ 9) :+ 6) :+ 3
unfoldlRangeWithBase :: Unfoldl n v w => (s -> Bool) -> (s -> (s, a)) -> s -> RangeR n w a -> RangeR v w a Source #
It is like unfoldlRange
. But it has already prepared values.
>>>
:set -XDataKinds
>>>
xs = NilR :++ 123 :+ 456 :: RangeR 1 5 Integer
>>>
unfoldlRangeWithBase (< 3) (\n -> (n + 1, n * 3)) 1 xs :: RangeR 3 5 Integer
(((NilR :++ 6) :+ 3) :+ 123) :+ 456
unfoldlRangeWithBaseWithS :: Unfoldl n v w => (s -> Bool) -> (s -> (s, a)) -> s -> RangeR n w a -> (s, RangeR v w a) Source #
It is like unfoldlRangeWithBase
.
But it return not only a list but also a state value.
>>>
:set -XDataKinds -fno-warn-tabs
>>>
xs = NilR :++ 123 :+ 456 :: RangeR 1 5 Integer
>>>
:{
unfoldlRangeWithBaseWithS (< 3) (\n -> (n + 1, n * 3)) 1 xs :: (Integer, RangeR 3 5 Integer) :} (3,(((NilR :++ 6) :+ 3) :+ 123) :+ 456)
with monad
unfoldlMRange :: (Unfoldl 0 v w, Monad m) => m Bool -> m a -> m (RangeR v w a) Source #
It is like unfoldlRange
. But it use a monad instead of a function.
>>>
:set -XDataKinds
>>>
:module + Data.IORef
>>>
r <- newIORef 1
>>>
count = readIORef r >>= \n -> n * 3 <$ writeIORef r (n + 1)
>>>
unfoldlMRange ((< 5) <$> readIORef r) count :: IO (RangeR 3 5 Integer)
(((NilR :++ 12) :+ 9) :+ 6) :+ 3
unfoldlMRangeWithBase :: (Unfoldl n v w, Monad m) => m Bool -> m a -> RangeR n w a -> m (RangeR v w a) Source #
It is like unfoldlMRange
. But it has already prepared values.
>>>
:set -XDataKinds
>>>
:module + Data.IORef
>>>
r <- newIORef 1
>>>
count = readIORef r >>= \n -> n * 3 <$ writeIORef r (n + 1)
>>>
xs = NilR :++ 123 :+ 456 :: RangeR 1 5 Integer
>>>
:{
unfoldlMRangeWithBase ((< 3) <$> readIORef r) count xs :: IO (RangeR 3 5 Integer) :} (((NilR :++ 6) :+ 3) :+ 123) :+ 456
unfoldlRangeMaybe
without monad
unfoldlRangeMaybe :: Unfoldl 0 v w => (s -> Maybe (s, a)) -> s -> Maybe (RangeR v w a) Source #
To evaluate a function to construct a list.
The function recieves a state and
return a nothing value or an element and a new state.
If the number of created elements is
less than a minimum number of list elements or
greater than a maximum number, then return Nothing
.
>>>
:set -XDataKinds
>>>
count n0 n = if n < n0 then Just (n + 1, n * 3) else Nothing
>>>
unfoldlRangeMaybe (count 2) 1 :: Maybe (RangeR 3 5 Int)
Nothing
>>>
unfoldlRangeMaybe (count 5) 1 :: Maybe (RangeR 3 5 Int)
Just ((((NilR :++ 12) :+ 9) :+ 6) :+ 3)
>>>
unfoldlRangeMaybe (count 10) 1 :: Maybe (RangeR 3 5 Int)
Nothing
unfoldlRangeMaybeWithBase :: Unfoldl n v w => (s -> Maybe (s, a)) -> s -> RangeR n w a -> Maybe (RangeR v w a) Source #
It is like unfoldlRangeMaybe
. But it has already prepared values.
>>>
:set -XDataKinds
>>>
count n = if n < 3 then Just (n + 1, n * 3) else Nothing
>>>
xs = NilR :++ 123 :+ 456 :: RangeR 1 5 Int
>>>
unfoldlRangeMaybeWithBase count 1 xs :: Maybe (RangeR 3 5 Int)
Just ((((NilR :++ 6) :+ 3) :+ 123) :+ 456)
with monad
unfoldlMRangeMaybe :: (Unfoldl 0 v w, Monad m) => m Bool -> m a -> m (Maybe (RangeR v w a)) Source #
It is like unfoldlRangeMaybe
. But it use a monad instead of a function.
The first argument monad returns a boolean value.
It creates values while this boolean value is True
.
If this boolean value is False
before to create enough values or
True
after to create full values, then unfoldlMRangeMaybe
returns Nothing.
>>>
:set -XDataKinds
>>>
:module + Data.IORef
>>>
r <- newIORef 1
>>>
check n0 = (< n0) <$> readIORef r
>>>
count = readIORef r >>= \n -> n * 3 <$ writeIORef r (n + 1)
>>>
unfoldlMRangeMaybe (check 2) count :: IO (Maybe (RangeR 3 5 Integer))
Nothing
>>>
writeIORef r 1
>>>
unfoldlMRangeMaybe (check 5) count :: IO (Maybe (RangeR 3 5 Integer))
Just ((((NilR :++ 12) :+ 9) :+ 6) :+ 3)
>>>
writeIORef r 1
>>>
unfoldlMRangeMaybe (check 10) count :: IO (Maybe (RangeR 3 5 Integer))
Nothing
unfoldlMRangeMaybeWithBase :: (Unfoldl n v w, Monad m) => m Bool -> m a -> RangeR n w a -> m (Maybe (RangeR v w a)) Source #
It is like unfoldrMRangeMaybe
. But it has already prepared values.
>>>
:set -XDataKinds
>>>
:module + Data.IORef
>>>
r <- newIORef 1
>>>
check = (< 3) <$> readIORef r
>>>
count = readIORef r >>= \n -> n * 3 <$ writeIORef r (n + 1)
>>>
xs = NilR :++ 123 :+ 456 :: RangeR 1 5 Integer
>>>
:{
unfoldlMRangeMaybeWithBase check count xs :: IO (Maybe (RangeR 3 5 Integer)) :} Just ((((NilR :++ 6) :+ 3) :+ 123) :+ 456)
ZipR
zipR :: ZipR n m v w => RangeR n m a -> RangeR v w b -> (RangeR (n - w) (m - v) a, RangeR v w (a, b)) Source #
To recieve two lists and return a tuple list and rest of the first list. The second list must be shorter or equal than the first list.
>>>
:set -XDataKinds
>>>
sampleZipR1 = NilR :++ 1 :+ 2 :+ 3 :+ 4 :+ 5 :+ 6 :: RangeR 5 7 Integer
>>>
sampleZipR2 = NilR :++ 3 :+ 2 :+ 1 :: RangeR 2 4 Integer
>>>
zipR sampleZipR1 sampleZipR2
(((NilR :++ 1) :++ 2) :+ 3,((NilR :++ (4,3)) :+ (5,2)) :+ (6,1))>>>
:type zipR sampleZipR1 sampleZipR2
zipR sampleZipR1 sampleZipR2 :: (RangeR 1 5 Integer, RangeR 2 4 (Integer, Integer))
zipWithR :: ZipR n m v w => (a -> b -> c) -> RangeR n m a -> RangeR v w b -> (RangeR (n - w) (m - v) a, RangeR v w c) Source #
It is like zipR
.
But it evaluates a function to make values instead of puts together in tuples.
>>>
:set -XDataKinds
>>>
sampleZipWithR1 = NilR :++ 1 :+ 2 :+ 3 :+ 4 :+ 5 :+ 6 :: RangeR 5 7 Integer
>>>
sampleZipWithR2 = NilR :++ 7 :+ 6 :+ 5 :: RangeR 2 4 Integer
>>>
zipWithR (+) sampleZipWithR1 sampleZipWithR2
(((NilR :++ 1) :++ 2) :+ 3,((NilR :++ 11) :+ 11) :+ 11)>>>
:type zipWithR (+) sampleZipWithR1 sampleZipWithR2
zipWithR (+) sampleZipWithR1 sampleZipWithR2 :: (RangeR 1 5 Integer, RangeR 2 4 Integer)
zipWithMR :: (ZipR n m v w, Monad q) => (a -> b -> q c) -> RangeR n m a -> RangeR v w b -> q (RangeR (n - w) (m - v) a, RangeR v w c) Source #
It is like zipWithR
.
But it uses a function which returns a monad instead of a simple value.
>>>
:set -XDataKinds
>>>
ns = NilR :++ 1 :+ 2 :+ 3 :+ 4 :+ 5 :+ 6 :: RangeR 5 7 Int
>>>
cs = NilR :++ 'a' :+ 'b' :+ 'c' :: RangeR 2 4 Char
>>>
zipWithMR (\n -> putStrLn . replicate n) ns cs
cccccc bbbbb aaaa (((NilR :++ 1) :++ 2) :+ 3,((NilR :++ ()) :+ ()) :+ ())
Repeat and Unfoldl Min and Max
repeat
repeatRMin :: (LoosenRMax n n m, Unfoldl 0 n n) => a -> RangeR n m a Source #
To repeat a value minimum number of times.
>>>
:set -XDataKinds
>>>
repeatRMin 123 :: RangeR 3 5 Integer
((NilR :+ 123) :+ 123) :+ 123
repeatRMax :: (LoosenRMin m m n, Unfoldl 0 m m) => a -> RangeR n m a Source #
To repeat a value maximum number of times.
>>>
:set -XDataKinds
>>>
repeatRMax 123 :: RangeR 3 5 Integer
((((NilR :++ 123) :++ 123) :+ 123) :+ 123) :+ 123
unfoldl
unfoldlMin :: (LoosenRMax n n m, Unfoldl 0 n n) => (s -> (s, a)) -> s -> RangeR n m a Source #
To evaluate a function to construct values minimum number of times. The function recieves a state and return a value and a new state.
>>>
:set -XDataKinds
>>>
unfoldlMin (\n -> (n + 1, n * 3)) 1 :: RangeR 3 5 Integer
((NilR :+ 9) :+ 6) :+ 3
unfoldlMax :: (LoosenRMin m m n, Unfoldl 0 m m) => (s -> (s, a)) -> s -> RangeR n m a Source #
To eveluate a function to construct values maximum number of times. The function recieves a state and return a value and a new state.
>>>
:set -XDataKinds
>>>
unfoldlMax (\n -> (n + 1, n * 3)) 1 :: RangeR 3 5 Integer
((((NilR :++ 15) :++ 12) :+ 9) :+ 6) :+ 3
unfoldlM
unfoldlMMin :: (Monad m, LoosenRMax n n w, Unfoldl 0 n n) => m a -> m (RangeR n w a) Source #
It is like unfoldlMax
. But it uses a monad instead of a function.
>>>
:set -XDataKinds
>>>
:module + Data.IORef
>>>
r <- newIORef 1
>>>
count = readIORef r >>= \n -> n * 3 <$ writeIORef r (n + 1)
>>>
unfoldlMMin count :: IO (RangeR 3 5 Integer)
((NilR :+ 9) :+ 6) :+ 3
unfoldlMMax :: (Monad m, LoosenRMin w w n, Unfoldl 0 w w) => m a -> m (RangeR n w a) Source #
It is like unfoldlMax
. But it uses a monad instead of function.
>>>
:set -XDataKinds
>>>
:module + Data.IORef
>>>
r <- newIORef 1
>>>
count = readIORef r >>= \n -> n * 3 <$ writeIORef r (n + 1)
>>>
unfoldlMMax count :: IO (RangeR 3 5 Integer)
((((NilR :++ 15) :++ 12) :+ 9) :+ 6) :+ 3
LEFT TO RIGHT
class LeftToRight n m v w Source #
Instances
(1 <= v, LeftToRight (n + 1) (m + 1) (v - 1) (w - 1)) => LeftToRight n m v w Source # | |
(1 <= n, PushR (n - 1) (m - 1), LoosenRMax n m (m + w), LeftToRight n (m + 1) 0 (w - 1)) => LeftToRight n m 0 w Source # | |
LeftToRight n m 0 0 Source # | |
(++.+) :: LeftToRight n m v w => RangeR n m a -> RangeL v w a -> RangeR (n + v) (m + w) a infixl 5 Source #
To concatenate a right-list and a left-list and return a right-list.
>>>
:set -XDataKinds
>>>
sampleLeftToRight1 = NilR :++ 'f' :++ 'o' :+ 'o' :: RangeR 1 4 Char
>>>
sampleLeftToRight2 = 'b' :. 'a' :. 'r' :.. NilL :: RangeL 2 3 Char
>>>
sampleLeftToRight1 ++.+ sampleLeftToRight2
(((((NilR :++ 'f') :++ 'o') :++ 'o') :+ 'b') :+ 'a') :+ 'r'>>>
:type sampleLeftToRight1 ++.+ sampleLeftToRight2
sampleLeftToRight1 ++.+ sampleLeftToRight2 :: RangeR 3 7 Char
leftToRight :: forall v w a. LeftToRight 0 0 v w => RangeL v w a -> RangeR v w a Source #
To convert a left-list to a right-list.
>>>
:set -XDataKinds -fno-warn-tabs
>>>
:{
sampleLeftToRight :: RangeL 3 8 Char sampleLeftToRight = 'h' :. 'e' :. 'l' :. 'l' :.. 'o' :.. NilL :}
>>>
leftToRight sampleLeftToRight
((((NilR :++ 'h') :++ 'e') :+ 'l') :+ 'l') :+ 'o'
RIGHT TO LEFT
class RightToLeft n m v w Source #
Instances
(1 <= n, RightToLeft (n - 1) (m - 1) (v + 1) (w + 1)) => RightToLeft n m v w Source # | |
(1 <= v, PushL (v - 1) (w - 1), LoosenLMax v w (m + w), RightToLeft 0 (m - 1) v (w + 1)) => RightToLeft 0 m v w Source # | |
RightToLeft 0 0 v w Source # | |
(++..) :: RightToLeft n m v w => RangeR n m a -> RangeL v w a -> RangeL (n + v) (m + w) a infixr 5 Source #
To concatenate a right-list and a left-list and return a left-list.
>>>
:set -XDataKinds
>>>
sampleRightToLeft1 = NilR :++ 'f' :++ 'o' :+ 'o' :: RangeR 1 4 Char
>>>
sampleRightToLeft2 = 'b' :. 'a' :. 'r' :.. NilL :: RangeL 2 3 Char
>>>
sampleRightToLeft1 ++.. sampleRightToLeft2
'f' :. ('o' :. ('o' :. ('b' :.. ('a' :.. ('r' :.. NilL)))))
rightToLeft :: forall n m a. RightToLeft n m 0 0 => RangeR n m a -> RangeL n m a Source #
To convert a right-list to a left-list.
>>>
:set -XDataKinds
>>>
:{
sampleRightToLeft :: RangeR 3 8 Char sampleRightToLeft = NilR :++ 'h' :++ 'e' :+ 'l' :+ 'l' :+ 'o' :}
>>>
rightToLeft sampleRightToLeft
'h' :. ('e' :. ('l' :. ('l' :.. ('o' :.. NilL))))