Skip to content

Commit 00241af

Browse files
Merge pull request #105 from dwhitney/master
added toArrayOf and toArrayOfOn
2 parents f9211df + 99bc60a commit 00241af

File tree

3 files changed

+31
-3
lines changed

3 files changed

+31
-3
lines changed

src/Data/Lens.purs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,5 +31,5 @@ import Data.Lens.Traversal (Traversal, Traversal', element, elementsOf, failover
3131
import Data.Lens.Types (class Wander, ALens, ALens', APrism, APrism', AnIso, AnIso', Fold, Fold', Getter, Getter', AGetter, AGetter', IndexedFold, IndexedFold', IndexedGetter, IndexedGetter', IndexedOptic, IndexedOptic', IndexedSetter, IndexedSetter', IndexedTraversal, IndexedTraversal', Iso, Iso', Lens, Lens', Optic, Optic', Prism, Prism', Review, Review', Setter, Setter', Traversal, Traversal', Exchange(..), Forget(..), Indexed(..), Market(..), Re(..), Shop(..), Tagged(..), wander)
3232
import Data.Lens.Setter (IndexedSetter, Setter, Setter', Indexed(..), addModifying, addOver, appendModifying, appendOver, assign, assignJust, conjModifying, conjOver, disjModifying, disjOver, divModifying, divOver, iover, modifying, mulModifying, mulOver, over, set, setJust, subModifying, subOver, (%=), (%~), (&&=), (&&~), (*=), (*~), (++=), (++~), (+=), (+~), (-=), (-~), (.=), (.~), (//=), (//~), (<>=), (<>~), (?=), (?~), (||=), (||~))
3333
import Data.Lens.Getter (Fold, Getter, IndexedFold, IndexedGetter, Optic, Indexed(..), iuse, iview, to, takeBoth, use, view, viewOn, (^.), cloneGetter)
34-
import Data.Lens.Fold (Fold, Fold', allOf, andOf, anyOf, elemOf, filtered, findOf, firstOf, foldMapOf, foldOf, folded, foldlOf, foldrOf, has, hasn't, iallOf, ianyOf, ifoldMapOf, ifoldlOf, ifoldrOf, itoListOf, itraverseOf_, lastOf, lengthOf, maximumOf, minimumOf, notElemOf, orOf, preview, previewOn, productOf, replicated, sequenceOf_, sumOf, toListOf, toListOfOn, unfolded, (^..), (^?))
34+
import Data.Lens.Fold (Fold, Fold', allOf, andOf, anyOf, elemOf, filtered, findOf, firstOf, foldMapOf, foldOf, folded, foldlOf, foldrOf, has, hasn't, iallOf, ianyOf, ifoldMapOf, ifoldlOf, ifoldrOf, itoListOf, itraverseOf_, lastOf, lengthOf, maximumOf, minimumOf, notElemOf, orOf, preview, previewOn, productOf, replicated, sequenceOf_, sumOf, toArrayOf, toArrayOfOn, toListOf, toListOfOn, unfolded, (^..), (^?))
3535
import Data.Lens.Common (_1, _2, _Just, _Left, _Nothing, _Right, first, left, right, second, united)

src/Data/Lens/Fold.purs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,15 @@ module Data.Lens.Fold
55
, preview, foldOf, foldMapOf, foldrOf, foldlOf, toListOf, firstOf, lastOf
66
, maximumOf, minimumOf, allOf, anyOf, andOf, orOf, elemOf, notElemOf, sumOf
77
, productOf, lengthOf, findOf, sequenceOf_, traverseOf_, has, hasn't
8-
, replicated, filtered, folded, unfolded
8+
, replicated, filtered, folded, unfolded, toArrayOf, toArrayOfOn
99
, ifoldMapOf, ifoldrOf, ifoldlOf, iallOf, ianyOf, itoListOf, itraverseOf_
1010
, module ExportTypes
1111
)
1212
where
1313

1414
import Prelude
1515

16+
import Data.Array (fromFoldable) as Array
1617
import Data.Either (Either(..), either)
1718
import Data.Foldable (class Foldable, foldMap)
1819
import Data.HeytingAlgebra (tt, ff)
@@ -148,6 +149,15 @@ toListOfOn s p = toListOf p s
148149

149150
infixl 8 toListOfOn as ^..
150151

152+
-- | Collects the foci of a `Fold` into an array.
153+
toArrayOf :: forall s t a b. Fold (Endo (->) (List a)) s t a b -> s -> Array a
154+
toArrayOf p = Array.fromFoldable <<< toListOf p
155+
156+
-- | Synonym for `toArrayOf`, reversed.
157+
toArrayOfOn :: forall s t a b. s -> Fold (Endo (->) (List a)) s t a b -> Array a
158+
toArrayOfOn s p = toArrayOf p s
159+
160+
151161
-- | Determines whether a `Fold` has at least one focus.
152162
has :: forall s t a b r. HeytingAlgebra r => Fold (Disj r) s t a b -> s -> r
153163
has p = unwrap <<< foldMapOf p (const (Disj tt))

test/Main.purs

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import Prelude
55
import Control.Monad.State (evalState, get)
66
import Data.Distributive (class Distributive)
77
import Data.Either (Either(..))
8-
import Data.Lens (Getter', _1, _2, _Just, _Left, collectOf, lens, preview, takeBoth, traversed, view)
8+
import Data.Lens (Getter', Prism', _1, _2, _Just, _Left, collectOf, lens, preview, prism', takeBoth, toArrayOf, traversed, view)
99
import Data.Lens.Fold ((^?))
1010
import Data.Lens.Fold.Partial ((^?!), (^@?!))
1111
import Data.Lens.Grate (Grate, cloneGrate, grate, zipWithOf)
@@ -39,6 +39,23 @@ fooGetter = foo
3939
barGetter :: forall x. Getter' { bar :: x } x
4040
barGetter = bar
4141

42+
-- testing toArrayOf with traversed and a couple of prisms
43+
data ABC = A (Array XYZ) | B | C
44+
data XYZ = X Number | Y | Z
45+
46+
_A :: Prism' ABC (Array XYZ)
47+
_A = prism' A case _ of
48+
(A array) -> Just array
49+
_ -> Nothing
50+
51+
_X :: Prism' XYZ Number
52+
_X = prism' X case _ of
53+
(X number) -> Just number
54+
_ -> Nothing
55+
56+
arrayOfNumbers :: ABC -> Array Number
57+
arrayOfNumbers = toArrayOf (_A <<< traversed <<< _X)
58+
4259
-- check we can compose getters
4360
fooBarGetter :: forall x. Getter' { foo :: { bar :: x } } x
4461
fooBarGetter = foo <<< bar
@@ -109,6 +126,7 @@ main = do
109126
logShow $ view bars doc
110127
logShow $ view barAndFoo { bar: "bar", foo: "foo" }
111128
logShow $ doc2 ^? _1bars
129+
logShow $ arrayOfNumbers $ A [(X 1.0), (X 2.0), (X 3.0)]
112130
logShow $ unsafePartial $ doc2 ^?! _1bars
113131
logShow $ unsafePartial $ Tuple 0 1 ^@?! i_2
114132
logShow stateTest

0 commit comments

Comments
 (0)