module Data.Accessor.Example where

import Data.Accessor.Basic ((.>), ($%), (^.), (^:), (^=), )
import Data.Accessor.Tuple (first, second, first3, second3, )

import qualified Data.Accessor.Container as Container
import qualified Data.Accessor.BinaryRead as Read
import qualified Data.Accessor.Show as Show
import qualified Data.Accessor.Basic as Accessor

import qualified Data.Array as Array
import qualified Data.Set   as Set
import qualified Data.Map   as Map

import Data.Char (ord, toUpper, )

import Prelude hiding (init)


{- * Example accesses -}

{- | Example of using 'set', 'get', 'modify'. -}
plain :: Int
plain :: Int
plain =
   forall r a. T r a -> r -> a
Accessor.get forall a b. T (a, b) b
second forall a b. (a -> b) -> a -> b
$
   forall r a. T r a -> (a -> a) -> r -> r
Accessor.modify forall a b. T (a, b) b
second forall a. Enum a => a -> a
succ forall a b. (a -> b) -> a -> b
$
   forall r a. T r a -> a -> r -> r
Accessor.set forall a b. T (a, b) a
first Char
'a' forall a b. (a -> b) -> a -> b
$
   (Char
'b',Int
7)

init :: (Char,Int)
init :: (Char, Int)
init =
   forall r. [r -> r] -> r -> r
Accessor.compose
      [forall r a. T r a -> a -> r -> r
Accessor.set forall a b. T (a, b) a
first Char
'b',
       forall r a. T r a -> (a -> a) -> r -> r
Accessor.modify forall a b. T (a, b) a
first forall a. Enum a => a -> a
succ,
       forall r a. T r a -> a -> r -> r
Accessor.set forall a b. T (a, b) b
second Int
7]
      (forall a. HasCallStack => a
undefined,forall a. HasCallStack => a
undefined)
--   setMany [first 'b', second 7] (undefined,undefined)

initInfix :: (Char,Int)
initInfix :: (Char, Int)
initInfix =
   (forall a. HasCallStack => a
undefined,forall a. HasCallStack => a
undefined)
   forall a b. a -> (a -> b) -> b
$% forall a b. T (a, b) a
first forall r a. T r a -> a -> r -> r
^= Char
'b'
   forall a b. a -> (a -> b) -> b
$% forall a b. T (a, b) a
first forall r a. T r a -> (a -> a) -> r -> r
^: forall a. Enum a => a -> a
succ
   forall a b. a -> (a -> b) -> b
$% forall a b. T (a, b) b
second forall r a. T r a -> a -> r -> r
^= Int
7

read :: Maybe ((Char,Int), Read.Stream)
read :: Maybe ((Char, Int), Stream)
read =
   forall s r. Parser s r -> (r, s) -> Maybe (r, s)
Read.runParser
      (forall s r. [Parser s r] -> Parser s r
Read.record [forall s a r. (ByteStream s, C a) => T r a -> Parser s r
Read.field forall a b. T (a, b) a
first, forall s a r. (ByteStream s, C a) => T r a -> Parser s r
Read.field forall a b. T (a, b) b
second])
      ((forall a. HasCallStack => a
undefined,forall a. HasCallStack => a
undefined),
       forall a b. (Integral a, Num b) => a -> b
fromIntegral (Char -> Int
ord Char
'c') forall a. a -> [a] -> [a]
: Word8
59 forall a. a -> [a] -> [a]
: Word8
154 forall a. a -> [a] -> [a]
: Word8
202 forall a. a -> [a] -> [a]
: Word8
0 forall a. a -> [a] -> [a]
: [])

infix0 :: Int
infix0 :: Int
infix0 =
   ((Char
'b',Int
7),String
"hallo")forall r a. r -> T r a -> a
^.forall a b. T (a, b) a
firstforall r a. r -> T r a -> a
^.forall a b. T (a, b) b
second

infix1 :: ((Char, Int), String)
infix1 :: ((Char, Int), String)
infix1 =
   ((Char
'b',Int
7),String
"hallo")forall a b. a -> (a -> b) -> b
$%forall a b. T (a, b) a
firstforall r a. T r a -> (a -> a) -> r -> r
^:forall a b. T (a, b) b
secondforall r a. T r a -> (a -> a) -> r -> r
^:(Int
1forall a. Num a => a -> a -> a
+)

infix2 :: ((Char, Int), String)
infix2 :: ((Char, Int), String)
infix2 =
   ((Char
'b',Int
7),String
"hallo")forall a b. a -> (a -> b) -> b
$%forall a b. T (a, b) a
firstforall r a. T r a -> (a -> a) -> r -> r
^:forall a b. T (a, b) b
secondforall r a. T r a -> a -> r -> r
^=Int
10

infix3 :: Int
infix3 :: Int
infix3 =
   ((Char
'b',Int
7),String
"hallo")forall r a. r -> T r a -> a
^.(forall a b. T (a, b) a
firstforall a b c. T a b -> T b c -> T a c
.>forall a b. T (a, b) b
second)

infix4 :: ((Char, Int), String)
infix4 :: ((Char, Int), String)
infix4 =
   ((Char
'b',Int
7),String
"hallo")forall a b. a -> (a -> b) -> b
$%(forall a b. T (a, b) a
firstforall a b c. T a b -> T b c -> T a c
.>forall a b. T (a, b) b
second)forall r a. T r a -> (a -> a) -> r -> r
^:(Int
1forall a. Num a => a -> a -> a
+)


showsPair :: Int -> (Char, Int) -> ShowS
showsPair :: Int -> (Char, Int) -> ShowS
showsPair =
   forall r.
[r -> r -> Maybe ShowS] -> String -> r -> Int -> r -> ShowS
Show.showsPrec
      [forall a r.
(Show a, Eq a) =>
String -> T r a -> r -> r -> Maybe ShowS
Show.field String
"first"  forall a b. T (a, b) a
first,
       forall a r.
(Show a, Eq a) =>
String -> T r a -> r -> r -> Maybe ShowS
Show.field String
"second" forall a b. T (a, b) b
second]
      String
"init" (Char, Int)
init

show0 :: String
show0 :: String
show0 = Int -> (Char, Int) -> ShowS
showsPair Int
11 (Char, Int)
init String
""

show1 :: String
show1 :: String
show1 = Int -> (Char, Int) -> ShowS
showsPair Int
5 (Char
'd',Int
8) String
""


self :: Char
self :: Char
self = forall r. T r r
Accessor.self forall r a. T r a -> (a -> a) -> r -> r
^: forall a. Enum a => a -> a
succ forall a b. (a -> b) -> a -> b
$ Char
'a'

null :: Char
null :: Char
null = forall r. T r ()
Accessor.null forall r a. T r a -> a -> r -> r
^= () forall a b. (a -> b) -> a -> b
$ Char
'a'

{- |
Modify a value of the 'ord' function.
-}
result :: [Int]
result :: [Int]
result =
   let f :: Char -> Int
f = (forall a b. Eq a => a -> T (a -> b) b
Accessor.result Char
'a' forall r a. T r a -> a -> r -> r
^= Int
65) Char -> Int
ord
   in  forall a b. (a -> b) -> [a] -> [b]
map Char -> Int
f String
"abcABC"

{- |
Modify a value of a curried function.
-}
result2 :: [Int]
result2 :: [Int]
result2 =
   let f :: Int -> Int -> Int
f = (forall a b. Eq a => a -> T (a -> b) b
Accessor.result Int
0 forall r a. T r a -> (a -> a) -> r -> r
^: forall a b. Eq a => a -> T (a -> b) b
Accessor.result Int
0 forall r a. T r a -> a -> r -> r
^= Int
1) forall a. Integral a => a -> a -> a
div
   in  forall a b. (a -> b) -> [a] -> [b]
map (forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry Int -> Int -> Int
f) [(Int
4,Int
2), (Int
2,Int
1), (Int
0,Int
0)]


merge :: (Int, Char, Ordering)
merge :: (Int, Char, Ordering)
merge =
   forall a b c. T a b -> T a c -> T a (b, c)
Accessor.merge forall a b c. T (a, b, c) a
first3 forall a b c. T (a, b, c) b
second3 forall r a. T r a -> a -> r -> r
^= (Int
42, Char
'c') forall a b. (a -> b) -> a -> b
$
   (Int
23, Char
'a', Ordering
GT)

accessHourMinute :: Accessor.T (Int, Int, Int) Int
accessHourMinute :: T (Int, Int, Int) Int
accessHourMinute =
   forall a b c. T a b -> T a c -> T a (b, c)
Accessor.merge forall a b c. T (a, b, c) a
first3 forall a b c. T (a, b, c) b
second3 forall a b c. T a b -> T b c -> T a c
.>
   forall b a. (b -> a) -> (a -> b) -> T a b
Accessor.fromWrapper (\Int
h -> forall a. Integral a => a -> a -> (a, a)
divMod Int
h Int
60) (\(Int
h,Int
m) -> Int
hforall a. Num a => a -> a -> a
*Int
60forall a. Num a => a -> a -> a
+Int
m)

mergeHourMinute :: (Int, Int, Int)
mergeHourMinute :: (Int, Int, Int)
mergeHourMinute =
   T (Int, Int, Int) Int
accessHourMinute forall r a. T r a -> (a -> a) -> r -> r
^: (Int
15forall a. Num a => a -> a -> a
+) forall a b. (a -> b) -> a -> b
$
   (Int
12, Int
58, Int
13)


array :: Array.Array Int Char
array :: Array Int Char
array =
   forall i e. Ix i => i -> T (Array i e) e
Container.array Int
7 forall r a. T r a -> (a -> a) -> r -> r
^: Char -> Char
toUpper forall a b. (a -> b) -> a -> b
$
   forall i e. Ix i => i -> T (Array i e) e
Container.array Int
2 forall r a. T r a -> a -> r -> r
^= Char
'z' forall a b. (a -> b) -> a -> b
$
   forall i e. Ix i => (i, i) -> [e] -> Array i e
Array.listArray (Int
0,Int
9) [Char
'a'..]

set :: Set.Set Char
set :: Set Char
set =
   forall a. Ord a => a -> T (Set a) Bool
Container.set Char
'a' forall r a. T r a -> a -> r -> r
^= Bool
False forall a b. (a -> b) -> a -> b
$
   forall a. Ord a => a -> T (Set a) Bool
Container.set Char
'd' forall r a. T r a -> (a -> a) -> r -> r
^: Bool -> Bool
not forall a b. (a -> b) -> a -> b
$
   forall a. Ord a => a -> T (Set a) Bool
Container.set Char
'b' forall r a. T r a -> a -> r -> r
^= Bool
True forall a b. (a -> b) -> a -> b
$
   forall a. Ord a => [a] -> Set a
Set.fromList [Char
'a',Char
'c']

mapDefault :: Map.Map Int Char
mapDefault :: Map Int Char
mapDefault =
   forall key elem. Ord key => elem -> key -> T (Map key elem) elem
Container.mapDefault Char
' ' Int
1 forall r a. T r a -> a -> r -> r
^= Char
'-' forall a b. (a -> b) -> a -> b
$
   forall key elem. Ord key => elem -> key -> T (Map key elem) elem
Container.mapDefault Char
' ' Int
3 forall r a. T r a -> a -> r -> r
^= Char
'z' forall a b. (a -> b) -> a -> b
$
   forall key elem. Ord key => elem -> key -> T (Map key elem) elem
Container.mapDefault Char
' ' Int
5 forall r a. T r a -> (a -> a) -> r -> r
^: Char -> Char
toUpper forall a b. (a -> b) -> a -> b
$
   forall key elem. Ord key => elem -> key -> T (Map key elem) elem
Container.mapDefault Char
' ' Int
9 forall r a. T r a -> (a -> a) -> r -> r
^: Char -> Char
toUpper forall a b. (a -> b) -> a -> b
$
   forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList forall a b. (a -> b) -> a -> b
$ forall a b. [a] -> [b] -> [(a, b)]
zip (forall a b. (a -> b) -> [a] -> [b]
map (forall a b. (Num a, Integral b) => a -> b -> a
^(Int
2::Int)) [Int
0..Int
7]) [Char
'a'..]

mapMaybe :: Map.Map Int Char
mapMaybe :: Map Int Char
mapMaybe =
   forall key elem. Ord key => key -> T (Map key elem) (Maybe elem)
Container.mapMaybe Int
1 forall r a. T r a -> a -> r -> r
^= forall a. a -> Maybe a
Just Char
'-' forall a b. (a -> b) -> a -> b
$
   forall key elem. Ord key => key -> T (Map key elem) (Maybe elem)
Container.mapMaybe Int
2 forall r a. T r a -> a -> r -> r
^= forall a. Maybe a
Nothing forall a b. (a -> b) -> a -> b
$
   forall key elem. Ord key => key -> T (Map key elem) (Maybe elem)
Container.mapMaybe Int
3 forall r a. T r a -> a -> r -> r
^= forall a. a -> Maybe a
Just Char
'z' forall a b. (a -> b) -> a -> b
$
   forall key elem. Ord key => key -> T (Map key elem) (Maybe elem)
Container.mapMaybe Int
4 forall r a. T r a -> a -> r -> r
^= forall a. Maybe a
Nothing forall a b. (a -> b) -> a -> b
$
   forall key elem. Ord key => key -> T (Map key elem) (Maybe elem)
Container.mapMaybe Int
5 forall r a. T r a -> (a -> a) -> r -> r
^: forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Char -> Char
toUpper forall a b. (a -> b) -> a -> b
$
   forall key elem. Ord key => key -> T (Map key elem) (Maybe elem)
Container.mapMaybe Int
9 forall r a. T r a -> (a -> a) -> r -> r
^: forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Char -> Char
toUpper forall a b. (a -> b) -> a -> b
$
   forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList forall a b. (a -> b) -> a -> b
$ forall a b. [a] -> [b] -> [(a, b)]
zip (forall a b. (a -> b) -> [a] -> [b]
map (forall a b. (Num a, Integral b) => a -> b -> a
^(Int
2::Int)) [Int
0..Int
7]) [Char
'a'..]