<commit_before>-----------------------------------------------------------------------------
-- |
-- Module      :  Data.Set.Lens
-- Copyright   :  (C) 2012 <NAME>
-- License     :  BSD-style (see the file LICENSE)
-- Maintainer  :  <NAME> <<EMAIL>>
-- Stability   :  provisional
-- Portability :  portable
--
----------------------------------------------------------------------------
module Data.Set.Lens
  ( contains
  , members
  , setOf
  ) where

import Control.Applicative
import Control.Lens
import Data.Set as Set

-- | This 'Lens' can be used to read, write or delete a member of a 'Set'
--
-- > ghci> contains 3 +~ False $ Set.fromList [1,2,3,4]
-- > fromList [1,2,4]
--
-- > contains :: Ord k => k -> (Bool -> f Bool) -> Set k -> f (Set k)
contains :: Ord k => k -> Simple Lens (Set k) Bool
contains k f s = go <$> f (Set.member k s) where
  go False = Set.delete k s
  go True  = Set.insert k s
{-# INLINE contains #-}

-- | This 'Setter' can be used to change the type of a 'Set' by mapping
-- the elements to new values.
--
-- Sadly, you can't create a valid 'Traversal' for a 'Set', but you can
-- manipulate it by reading using 'folded' and reindexing it via 'setmap'.
--
-- > ghci> adjust members (+1) (fromList [1,2,3,4]
-- > fromList [2,3,4,5]
members :: (Ord i, Ord j) => Setter (Set i) (Set j) i j
members = sets Set.map

-- | Construct a set from a 'Getter', 'Fold', 'Traversal', 'Lens' or 'Iso'.
--
-- > setOf ::          Getter a c        -> a -> Set c
-- > setOf :: Ord c => Fold a c          -> a -> Set c
-- > setOf ::          Iso a b c d       -> a -> Set c
-- > setOf ::          Lens a b c d      -> a -> Set c
-- > setOf :: Ord c => Traversal a b c d -> a -> Set c
setOf :: Getting (Set c) a b c d -> a -> Set c
setOf l = getConst . l (Const . Set.singleton)<commit_msg>Fix syntax error in example<commit_after>-----------------------------------------------------------------------------
-- |
-- Module      :  Data.Set.Lens
-- Copyright   :  (C) 2012 <NAME>
-- License     :  BSD-style (see the file LICENSE)
-- Maintainer  :  <NAME> <<EMAIL>>
-- Stability   :  provisional
-- Portability :  portable
--
----------------------------------------------------------------------------
module Data.Set.Lens
  ( contains
  , members
  , setOf
  ) where

import Control.Applicative
import Control.Lens
import Data.Set as Set

-- | This 'Lens' can be used to read, write or delete a member of a 'Set'
--
-- > ghci> contains 3 +~ False $ Set.fromList [1,2,3,4]
-- > fromList [1,2,4]
--
-- > contains :: Ord k => k -> (Bool -> f Bool) -> Set k -> f (Set k)
contains :: Ord k => k -> Simple Lens (Set k) Bool
contains k f s = go <$> f (Set.member k s) where
  go False = Set.delete k s
  go True  = Set.insert k s
{-# INLINE contains #-}

-- | This 'Setter' can be used to change the type of a 'Set' by mapping
-- the elements to new values.
--
-- Sadly, you can't create a valid 'Traversal' for a 'Set', but you can
-- manipulate it by reading using 'folded' and reindexing it via 'setmap'.
--
-- > ghci> adjust members (+1) (fromList [1,2,3,4])
-- > fromList [2,3,4,5]
members :: (Ord i, Ord j) => Setter (Set i) (Set j) i j
members = sets Set.map

-- | Construct a set from a 'Getter', 'Fold', 'Traversal', 'Lens' or 'Iso'.
--
-- > setOf ::          Getter a c        -> a -> Set c
-- > setOf :: Ord c => Fold a c          -> a -> Set c
-- > setOf ::          Iso a b c d       -> a -> Set c
-- > setOf ::          Lens a b c d      -> a -> Set c
-- > setOf :: Ord c => Traversal a b c d -> a -> Set c
setOf :: Getting (Set c) a b c d -> a -> Set c
setOf l = getConst . l (Const . Set.singleton)
{'fraction_non_alphanumeric': 0.23488821418713773, 'fraction_numerical': 0.011592602815346398, 'mean_word_length': 1.6745387453874538, 'pattern_counts': {'":': 0, '<': 13, '<?xml version=': 0, '>': 81, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '2601457', 'n_tokens_mistral': 1221, 'n_tokens_neox': 1191, 'n_words': 481}