module Autolib.Util.Edit where
import Autolib.Util.Zufall
import Control.Monad
import Autolib.Util.Zufall ( eins )
cut :: Int -> Int -> [a] -> [a]
cut :: forall a. Int -> Int -> [a] -> [a]
cut Int
from Int
to [a]
w =
let ([a]
pre, [a]
post) = Int -> [a] -> ([a], [a])
forall a. Int -> [a] -> ([a], [a])
splitAt Int
from [a]
w
in [a]
pre [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ Int -> [a] -> [a]
forall a. Int -> [a] -> [a]
drop (Int
to Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
from) [a]
post
mirror :: Int -> Int -> [a] -> [a]
mirror :: forall a. Int -> Int -> [a] -> [a]
mirror Int
from Int
to [a]
w =
let ([a]
pre, [a]
post) = Int -> [a] -> ([a], [a])
forall a. Int -> [a] -> ([a], [a])
splitAt Int
from [a]
w
([a]
here, [a]
there) = Int -> [a] -> ([a], [a])
forall a. Int -> [a] -> ([a], [a])
splitAt (Int
to Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
from) [a]
post
in [a]
pre [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ [a] -> [a]
forall a. [a] -> [a]
reverse [a]
here [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ [a]
there
insert_slice :: Int -> Int -> Int -> [a] -> [a]
insert_slice :: forall a. Int -> Int -> Int -> [a] -> [a]
insert_slice Int
from Int
to Int
at [a]
w =
let slice :: [a]
slice = Int -> [a] -> [a]
forall a. Int -> [a] -> [a]
take (Int
to Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
from) ([a] -> [a]) -> [a] -> [a]
forall a b. (a -> b) -> a -> b
$ Int -> [a] -> [a]
forall a. Int -> [a] -> [a]
drop Int
from [a]
w
([a]
here, [a]
there) = Int -> [a] -> ([a], [a])
forall a. Int -> [a] -> ([a], [a])
splitAt Int
at [a]
w
in [a]
here [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ [a]
slice [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ [a]
there
max_edit :: Int
max_edit = Int
3 :: Int
some_cut :: RandomC m => [a] -> m [a]
some_cut :: forall (m :: * -> *) a. RandomC m => [a] -> m [a]
some_cut [a]
w = if [a] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
w Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
max_edit then [a] -> m [a]
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return [a]
w else do
d <- (Int, Int) -> m Int
forall a. Random a => (a, a) -> m a
forall (m :: * -> *) a. (RandomC m, Random a) => (a, a) -> m a
randomRIO ( Int
1 , Int
max_edit )
i <- randomRIO ( 0 , length w - d )
return $ cut i (i+d) w
some_mirror :: RandomC m => [a] -> m [a]
some_mirror :: forall (m :: * -> *) a. RandomC m => [a] -> m [a]
some_mirror [a]
w = if [a] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
w Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
max_edit then [a] -> m [a]
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return [a]
w else do
d <- (Int, Int) -> m Int
forall a. Random a => (a, a) -> m a
forall (m :: * -> *) a. (RandomC m, Random a) => (a, a) -> m a
randomRIO ( Int
1 , Int
max_edit )
i <- randomRIO ( 0 , length w - d )
return $ mirror i (i+d) w
some_insert_slice :: RandomC m => [a] -> m [a]
some_insert_slice :: forall (m :: * -> *) a. RandomC m => [a] -> m [a]
some_insert_slice [a]
w = if [a] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
w Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
max_edit then [a] -> m [a]
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return [a]
w else do
d <- (Int, Int) -> m Int
forall a. Random a => (a, a) -> m a
forall (m :: * -> *) a. (RandomC m, Random a) => (a, a) -> m a
randomRIO ( Int
1 , Int
max_edit )
i <- randomRIO ( 0 , length w - d )
k <- randomRIO (0 , length w - 1)
return $ insert_slice i (i+d) k w
edit :: RandomC m => [a] -> m [a]
edit :: forall (m :: * -> *) a. RandomC m => [a] -> m [a]
edit [a]
w = do
f <- [[a] -> m [a]] -> m ([a] -> m [a])
forall (m :: * -> *) a. RandomC m => [a] -> m a
eins
[ [a] -> m [a]
forall (m :: * -> *) a. RandomC m => [a] -> m [a]
some_cut
, [a] -> m [a]
forall (m :: * -> *) a. RandomC m => [a] -> m [a]
some_insert_slice
, [a] -> m [a]
forall (m :: * -> *) a. RandomC m => [a] -> m [a]
some_mirror
]
f w
edits :: RandomC m => [a] -> m [a]
edits :: forall (m :: * -> *) a. RandomC m => [a] -> m [a]
edits [a]
w = do
k <- (Int, Int) -> m Int
forall a. Random a => (a, a) -> m a
forall (m :: * -> *) a. (RandomC m, Random a) => (a, a) -> m a
randomRIO (Int
1, Int
max_edit)
foldM ( \ [a]
u ()
_ -> [a] -> m [a]
forall (m :: * -> *) a. RandomC m => [a] -> m [a]
edit [a]
u ) w $ replicate k ()